Как мне прослушать документ с идентификатором UID аутентификации? - PullRequest
0 голосов
/ 14 апреля 2019

В моем поиске есть несколько способов сделать это. Одним из способов является использование FutureBuilder и StreamBuilder одновременно. Но я хочу избежать этой вложенности StreamBuilder внутри FutureBuilder?

Я попытался создать метод и вызвать его из потокового компоновщика.

    _getData() async{

  FirebaseUser user =  await FirebaseAuth.instance.currentUser();
String uid = user.uid.toString();
var snapshots = 
Firestore.instance.collection('userinfo').document(uid).snapshots();
      return snapshots;
}


@override
 Widget build(BuildContext context) {
return new Scaffold(
  appBar: AppBar(
    title: Text('Retrieve Text Input'),
  ),
  body: new Container(
    padding: EdgeInsets.only(top: 20.0, left: 10.0, right: 10.0),
    child:  new StreamBuilder(
        stream: _getData(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            var userDocument = snapshot.data;
             return new Column(
                    children: <Widget>[
                      TextFormField(
                        initialValue:  userDocument["name"].toString(),
                        //controller: _AdContr,
                        decoration: new InputDecoration(
                          labelText: 'Name',
                          fillColor: Colors.white,
                          border: new OutlineInputBorder(
                            borderRadius: new BorderRadius.circular(25.0),
                            borderSide: new BorderSide(),
                          ),
                          //fillColor: Colors.green
                        ),
                      ),
                      SizedBox(height: 20),
                      TextFormField(
                        //initialValue: Text(userDocument["Surname"]).toString(),
                        //controller: _AdContr,
                        decoration: new InputDecoration(
                          labelText: 'Surname',
                          fillColor: Colors.white,
                          border: new OutlineInputBorder(
                            borderRadius: new BorderRadius.circular(25.0),
                            borderSide: new BorderSide(),
                          ),
                          //fillColor: Colors.green
                        ),
                      )
                    ],
                  );
          }
        }),
   ),
 );
}

Но я получаю эту ошибку:

тип 'Future' не является подтипом типа 'Stream'

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 14 апреля 2019

Вам потребуется вложить StreamBuilder в FutureBuilder, потому что вам нужно будет дождаться пользователя от FirebaseAuth, прежде чем вы сможете получить поток. Однако это совсем не плохо .
Вот как работает Flutter: вложенные виджеты.

..., child: FutureBuilder(
        future: FirebaseAuth.instance.currentUser(),
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
          if (snapshot.connectionState != ConnectionState.done) return Container();
          return StreamBuilder<DocumentSnapshot>(
            stream: Firestore.instance.collection('userinfo').document(snapshot.data.uid).snapshots(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if (!snapshot.hasData) return Container();
              return Column(...);
            },
          );
        })

Другим аспектом, который имеет решающее значение для этой работы, является то, что вы всегда возвращаете виджет от любого строителя. Если вы не вернете виджет сборщику во Flutter, ваше приложение сломается, то есть будет сгенерировано исключение во время выполнения.

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