1

我正在构建一个条形码阅读器,它在扫描条形码后显示产品的名称。名称和条形码存储在 mongodb 中,我编写了以下代码用于连接数据库:


    Future<Map> prod() async {
        Db db = Db('mongodb://192.168.2.5:27017/database');
        await db.open();
        DbCollection coll = db.collection('products');
        var information = await coll.findOne(where.eq('code', _Barcode));
        await db.close();
        return information;
        }

我使用未来的构建器来显示名称:

    FutureBuilder(
     future: prod(),
     builder: (buildContext, AsyncSnapshot snapshot) {
       if ( snapshot.data== null){
       return Container(
           child: Center(
               child: Text("Loading..."),
                        ),
     );} else{
       return ListView.builder(
       itemCount: snapshot.data.length,
       itemBuilder: (buildContext, int index) {
       return Container(
       child:snapshot.data.name,
            );
          });}
           },)

它一直显示加载文本。

4

1 回答 1

0

它在(windows os)之后工作: - 服务 -> MongoDB 服务器属性 -> 启动类型:将其更改为Manual。并mongod --bind_ip_all在cmd中运行。我已经将我的代码编辑为:

 Future getInfo() async {
    Db db = Db('mongodb://192.168.2.5:27017/thuDb');
    await db.open();

    print('Connected to database');

    DbCollection coll = db.collection('products');
    var information = await coll.findOne(where.eq('code', _scanBarcode));
    await db.close();
    List<String> r=[information['code'],information['name']] ;
    return r;
  }
/*.......
.......*/

 FutureBuilder(
  future: getInfo(),
  builder: (buildContext, AsyncSnapshot snapshot) {
    if (snapshot.hasError) throw snapshot.error;  
          else if (!snapshot.hasData){
          return Container(
            child: Center(
              child: Text("Waiting..."),
            ),
          );
          }
  else{
    return ListView(
            children:<Widget>[
            Text('Result: ${snapshot.data[0]}'),
            Text('Result: ${snapshot.data[1]}'),
            ]);
      }}

  )
于 2020-01-16T22:58:25.103 回答