Получение данных из QuerySnapshot во флаттере
Мне нужно заполнить DropdownButton из документа в Firestore. Я могу получить данные. Когда я смотрю в файл snapshot.data, я вижу 2 записи, которые я и ожидал увидеть. В приведенном ниже коде все работает нормально, если я закомментирую фрагмент кода, как вы видите.
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: некоторыми значениями из файла snapshot.data.
Как мне это сделать?
2 ответа
Ваша проблема здесь
items: snapshot.data.docs.map(( ISSUE HERE===>Map map) {
return new DropdownMenuItem<String>(
value: map["name"].toString(),
child: new Text(
map["name"],
),
);
}).toList(),
Значение для
docs
является
QueryDocumentSnapshot
а не тип
Map
вот почему вы получили сообщение об ошибке.
Вместо этого измените его на это.
items: snapshot.data.docs.map((documentSnapshot) {
return new DropdownMenuItem<String>(
value: documentSnapshot["name"].toString(),
child: new Text(
documentSnapshot["name"],
),
);
}).toList(),
Я нашел сообщение, в котором говорится использовать .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:?