#android #firebase #flutter #google-cloud-firestore
#Android #firebase #флаттер #google-облако-firestore
Вопрос:
Здесь я пытаюсь напечатать имя пользователя пользователя, и это выдает следующую ошибку.
Я создал функцию userData (), и код
userData() async
{
var userData = await _db.collection('users').document(_uuid).get();
return userData;
}
Где я просто получу данные конкретного пользователя, используя uid, и верну их.
Код, который я использовал для печати данных, выглядит следующим образом
return FutureBuilder(
future: authService.userData(),
builder: (_,snapshots){
if(snapshots.connectionState == ConnectionState.waiting)
{
return Center(child: Text('Loading...'),);
}
else{
print("Snapshots: " snapshots.toString());
return ListView.builder(itemCount: 1, itemBuilder: (_,index){
return ListTile(
title: Text(snapshots.data["username"].toString()),
);
});
}
}
);
Структура firestore такова
Коллекция (‘user’) -> документ (uid) -> 1.имя пользователя 2.электронная почта….
В чем причина этой ошибки и как ее устранить?
Ответ №1:
В сообщении об ошибке сообщается, что snapshots.data
значение равно null, поэтому вы не можете выполнить индексацию в нем с помощью []
оператора.
Перед использованием DocumentSnapshot вам следует проверить, существует ли он, прежде чем обращаться к данным его поля. Свойство data моментального снимка будет равно нулю, если документ не существует.
Комментарии:
1. В целях тестирования я использовал идентификатор документа, который присутствует в firestore. Поскольку оно возвращает null . в чем причина?
2. SDK сообщает вам, что документ не существует. Я не могу это проверить, потому что я не вижу данные, с которыми вы работаете.
3. Да, теперь я обновил данные firestore в виде изображения
4. Мы по-прежнему не видим, что вы передаете правильное значение
_uuid
. Если вы передадите что-либо, кроме идентификатора документа, ваш снимок не будет содержать данных.5. Я только что присвоил _uuid такой же в firestore. Просто скопировав и вставив и присвоив значение _uuid
Ответ №2:
Для Firestore я бы рекомендовал использовать Stream Builder, а не future Builder.
return StreamBuilder(
stream: Firestore.instance
.collection('user')
.document(uid)
.snapshots(),
builder: (_,snapshot){
if(!snapshot.hasData)
{
return Center(child: Text('Loading...'),);
}
else{
return ListView.builder(itemCount: 1, itemBuilder: (_,index){
return ListTile(
title: Text(snapshots.data["username"].toString()),
);
});
}
}
);