Флаттер: невозможно прочитать данные из базы данных. Метод '[]' был вызван при нулевой ошибке - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь прочитать данные из firebase после сканирования штрих-кода.

Вот как это должно выглядеть, но вместо штрих-кода должно отображаться имя и цена из базы данных (https://m.imgur.com/gallery/lEFJZ0Q)

I am reading from prd which has details of barcode

Код:

class ListTileModel {
  String barcode;
  ListTileModel(this.barcode);
}

приведенный ниже код находится внутри виджета с состоянием

List<ListTileModel> _items = [];
String barcode = "";

  void _add() {
    _items.add(ListTileModel(barcode));
      setState(() {});
  }


  @override
  void initState(){
    super.initState();
  }

Используется StreamBuiler:

new Container(

              child: ListView(
                  children: _items
                      .map((item) => StreamBuilder(
                  stream: FirebaseDatabase.instance.reference().child('prd').child(item.barcode).onValue,
                  builder: (context, snap) {
                    print(item.barcode);
                    if(snap.hasData){
                      DataSnapshot snapshot = snap.data.snapshot;
                      Map<dynamic, dynamic> itm = snapshot.value;
                      return snap.data.snapshot.value == null
                          ? SizedBox()
                          : ListView.builder(
                        shrinkWrap: true,
                        scrollDirection: Axis.vertical,
                        itemCount: 1,
                        itemBuilder: (context, index) {
                          return Row(
                            children: <Widget>[

                              ConstrainedBox(

                                child: Container(

                                  child: Text(itm[index]['name'],style: TextStyle(fontSize: 20),),
                                ),
                              ),
                              SizedBox(width: 100,),
                              ConstrainedBox(

                                child: Container(

                                  child: Text(itm[index]['price'].toString(),style: TextStyle(fontSize: 20),),
                                ),
                              ),
                            ],
                          );
                        },
                      );
                    }
                    else {
                      return   Center(child: CircularProgressIndicator());
                    }
                  }
              ),
                  ).toList()
              ),
            ),

Код сканирования штрих-кода:

виджет:

floatingActionButton: FloatingActionButton(
          onPressed: scan,
        child: Icon(Icons.add_shopping_cart),

      ),

scan ():

Future scan() async{
    try{
      String barcode = await BarcodeScanner.scan();
        setState(() {
          this.barcode = barcode;
        });
      _add();
    }on PlatformException catch(e) {
      if(e.code == BarcodeScanner.CameraAccessDenied){
        setState(() {
          this.barcode = 'Access Denied';
        });
      }
    }

Я получаю следующее сообщение об ошибке:

Было сгенерировано следующее NoSuchMethodError: Метод '[]' был вызван с нулевым значением. Получатель: null Пробный вызов:

1 Ответ

1 голос
/ 18 апреля 2020

Пожалуйста, попробуйте это и дайте мне знать, если это решит вашу проблему, вам нужно изменить

Text(itm[index]['name'],style: TextStyle(fontSize: 20),),

Text(itm[index]['price'].toString(),style: TextStyle(fontSize: 20),),

на

Text(itm['det']['name'],style: TextStyle(fontSize: 20),),

Text(itm['det']['price'].toString(),style: TextStyle(fontSize: 20),),

Дайте мне знать, если это работает для вас. Я считаю, что проблема также в индексе. сейчас твое высказывание.

...