Флаттер с помощью firebase пытается получить доступ к текущему пользователю на экране или виджете, отличном от моего экрана входа - PullRequest
0 голосов
/ 06 апреля 2020

Итак, у меня есть файл dart для экрана входа в систему, а затем другой домашний файл. Я пытаюсь получить доступ к идентификатору пользователя в домашнем файле, чтобы получить уникальный документ пользователя Cloud Firestore. Однако всякий раз, когда я вызываю getUser (), он говорит, что Future не является подтипом типа 'String'. Означает ли это, что по какой-то причине Future не разворачивается, чтобы вернуть строку uid?

getUser() async {
      FirebaseUser user = await FirebaseAuth.instance.currentUser();
      return user.uid;
  }

Здесь я вызываю get user в файле дротика, отличном от аутентификации, но в том же файле, что и моя функция getUser ().

return StreamBuilder<DocumentSnapshot>(
     stream: Firestore.instance.collection('watchlists').document(getUser()).snapshots(),
     builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot){
       if (snapshot.hasError) {
         return new Center(
           child: Text('Error: ${snapshot.error}'),
         );
       }
       if (!snapshot.hasData) {
         return new Center(
           child: CircularProgressIndicator(),
         );
       }
       else {
         var documents = snapshot.data.data;
         var vals = documents.values;
         List<WatchListItem> watchListItems = [];
         for (int x = 0; x < vals.length; x++) {
           watchListItems.add(
             WatchListItem(
               symbol: vals.elementAt(x).toString(),
               price: 190.79,
             ),
           );
         }

         return new Center(
           child: ListView(
             children: watchListItems,
           ),
         );
       }
     },
   );

Когда я пытаюсь получить getUser ( ) .toString () ошибка, которую я получаю, состоит в том, что 'значения' получателя были вызваны на нуль (я пытаюсь получить значения базы данных) Доступ к текущему пользователю возможен только во время аутентификации? Или к нему можно получить доступ в любом месте приложения в любое время, пока пользователь вошел в систему? Обходной путь, который я вижу, состоит в том, чтобы получить идентификатор пользователя при входе в систему, а затем передать его в качестве параметра каждому новому виджету, которому я go. У меня действительно тяжелые времена с этим, потому что у Google едва ли есть какая-либо документация по использованию их собственного Flutter с их Firebase.

1 Ответ

1 голос
/ 06 апреля 2020

getUser() возвращает Future<String>, в то время как document() принимает String в качестве аргумента:

/// so that the resulting list will be chronologically-sorted.
  DocumentReference document([String path]) =>
      DocumentReference._(_delegate.document(path), firestore);

Поэтому лучшее место для вызова getUser() находится внутри initState. Внутри initState вы можете сделать:

String userId = await getUser();

Затем использовать userId in document()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...