Получатель 'docs' не определен для типа 'AsyncSnapshot <Object?>'
После перехода на нулевую безопасность возникает ошибка. Получатель docs не определен для типа AsyncSnapshot<Object?>. Попробуйте импортировать библиотеку, которая определяет «документы», изменив имя на имя существующего получателя или определив получатель или поле с именем «docs».
Фрагмент кода с ошибкой
return FutureBuilder(
future: searchResultsFuture,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
}
List<UserResult> searchResults = [];
snapshot.docs.forEach((doc) { //have error here
User user = User.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
return ListView(
children: searchResults,
);
},
);
}
поискРезультатыБудущее
handleSearch(String query) {
Future<QuerySnapshot> users =
usersRef.where("displayName", isGreaterThanOrEqualTo: query).get();
setState(() {
searchResultsFuture = users;
});
}
clearSearch() {
searchController.clear();
}
3 ответа
В
snapshot
в вашем коде AsyncSnapshot
, который действительно не имеет
docs
ребенок. Чтобы получить документы из Firestore, вам необходимо использовать:
snapshot.data.docs
Также см. Документацию FlutterFire по прослушиванию данных в реальном времени , которая содержит пример, показывающий это - и мой ответ здесь, объясняющий все типы снимков: В чем разница между существующими типами снимков в Firebase?
изменить так:
return FutureBuilder(
future: searchResultsFuture,
builder: (context, **AsyncSnapshot** snapshot) {
if (!snapshot.hasData) {
return circularProgress();
}
List<UserResult> searchResults = [];
**snapshot.data!.docs.forEach((doc) {**
User user = User.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
return ListView(
children: searchResults,
);
},
);
}
Обычно для получения данных требуется несколько мс, поэтому я попробовал это, чтобы убедиться, что мои операции выполняются после получения данных
if (snapshot.hasData) {
//your code
}