Flutter: Firebase auth и поток снимков Firestore - PullRequest
0 голосов
/ 17 декабря 2018

В моем приложении для флаттера я использую базу данных firebase для аутентификации и базы данных firestore.Я также пытаюсь следовать шаблону BLOC.

После успешного входа в систему мне нужно построить экран пользовательского интерфейса, используя некоторые данные, хранящиеся в документе:

 @override
  Widget build(BuildContext context) {

    return FutureBuilder(
      future: Auth.of(context).firebase.uid(), 
      builder: (context, snap){

        if(snap.hasData) {
          print("Your uid is ${snap.data}");
          return StreamBuilder(

            stream: Firestore.instance.collection('USERS').document(snap.data).collection('PHOTOS').document(
                widget.photoID).snapshots(),
            builder: (context, AsyncSnapshot<DocumentSnapshot> snap) {...}

Теперь все работает нормально.

Auth - это класс-оболочка для Firebase Auth, расширяющий InheritedWidget, где метод .uid () возвращает Future с идентификатором пользователя.Затем я использую StreamBuilder для создания пользовательского интерфейса, передающего uid для получения DocumentSnapshot.

Итак, вот мой вопрос: есть ли лучший подход для достижения этой цели и избежать вложения StreamBuilder внутри FutureBuilder?

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете создать функцию async, которая возвращает снимок Firestore и позволяет нам извлечь будущее uid без FutureBuilder и обработать uid внутри функции.

_getData() async{
    String uid = await Auth.of(context).firebase.uid();
    var snapshots = await Firestore.instance.collection('USERS')
        .document(snap.data)
        .collection('PHOTOS')
        .document(widget.photoID).snapshots();
    return snapshots;
}

Мы будем использовать эту функцию в StreamBuilder

@override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: _getData(), 
         builder: (context, AsyncSnapshot<DocumentSnapshot> snap) {...}
    );
}

Это мой подход к избеганию вложенных StreamBuilder или FutureBuilder.

...