Получение данных из QuerySnapshot во флаттере

Мне нужно заполнить DropdownButton из документа в Firestore. Я могу получить данные. Когда я смотрю в файл snapshot.data, я вижу две записи, которые я и ожидал увидеть. В приведенном ниже коде все работает нормально, если я закомментирую фрагмент кода, как вы видите.

    Container(
                      child: StreamBuilder(
                          //stream: _firestoreService.getAgency(),
                          stream: _db.collection('agency').snapshots(),
                          builder: (BuildContext context, AsyncSnapshot snapshot) {
                            if (snapshot.data == null) {
                              return Center(
                                child: CircularProgressIndicator(),
                              );
                            } else {
                              //var length = snapshot.data.docs.length;
                              //print('length: ' + length);
                              return new DropdownButton<String>(
                                hint: new Text("Select Agency"),
                                value: _currentAgency,
    /*  <<<< The code below is where I am having problems
                                //onChanged: changedDropDownState,
                                **items: snapshot.data.docs.map((Map map) {
                                  return new DropdownMenuItem<String>(
                                    value: map["name"].toString(),
                                    child: new Text(
                                    map["name"],
                                    ),
                                  );
                                }).toList(),**
*/
                              );
                            }
                            ;
                          }),
                    ),

Когда я раскомментирую код и запускаю приложение, я получаю такую ​​ошибку:

======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#d9273):
type '(Map<dynamic, dynamic>) => DropdownMenuItem<String>' is not a subtype of type '(QueryDocumentSnapshot) => dynamic' of 'f'

Я хочу заполнить атрибут value: идентификатором документа, но я не вижу его в файле snapshot.data. Еще я хочу заполнить child: attribute некоторыми значениями из файла snapshot.data.

Как мне это сделать?

См. также:  Развертывание приложения на gke из CI
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. LostTexan

    Ваша проблема здесь

    items: snapshot.data.docs.map(( ISSUE HERE===>Map map) {
      return new DropdownMenuItem<String>(
      value: map["name"].toString(),
      child: new Text(
      map["name"],
         ),
       );
     }).toList(),
    

    Значение docsQueryDocumentSnapshot, а не тип Map, поэтому вы получили сообщение об ошибке.

    Вместо этого измените его на это.

    items: snapshot.data.docs.map((documentSnapshot) {
      return new DropdownMenuItem<String>(
      value: documentSnapshot["name"].toString(),
      child: new Text(
      documentSnapshot["name"],
         ),
       );
     }).toList(),
    
  2. LostTexan

    Я нашел сообщение, в котором говорится использовать .forEach вместо карты (Код моментального снимка внутри StreamBuilder не запускается при получении данных из Firebase FireCloud во Flutter).

    Это избавляет от ошибки, но DropdownButton статичен и не раскрывается и не позволяет мне нажимать на нее. Вот мой новый код для DropdownButton:

    return new DropdownButton<String>(
                                hint: new Text("Select Agency"),
                                value: _currentAgency,
                                //onChanged: changedDropDownState,
                                items: snapshot.data.docs.forEach((document) {
                                  return new DropdownMenuItem<String>(
                                    value: document.data()['name'],
                                    child: new Text(document.data()['name']),
                                  );
                                }),
                              );
    

    Данные есть, и я вижу их при отладке. Я тоже хочу получить documentId, но не вижу его в отладчике.

    Как сделать так, чтобы DropdownButton стал активным, и как добавить documentId к атрибуту value :?

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: