Как извлечь данные из одного документа и показать их в приложении?

#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()),
          );
        });
      }
    }
  );