Как читать данные из firebase внутри виджета AlertDialog? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь прочитать данные из firebase внутри AlertDialog во флаттере, когда нажимается кнопка, а затем обновить ее.

Я пытался использовать StreamBuilder, но ничего не происходит

  new FlatButton(
      child: const Text('+ Add'),
      onPressed: () {
        StreamBuilder(
            stream: Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').snapshots(),
            builder: (context, snapshot) {
              var TypeSelfFilters = snapshot.data;
              List<String> ListOfTypeSelf = List.from(TypeSelfFilters["Personer"]);
              ListOfTypeSelf.add("value of TextFormField");
              Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').updateData({'Personer': ListOfTypeSelf});
            }
        );
        Navigator.pop(context);
      }
  );

Я не получаю никаких ошибок, но код внутри StreamBuilder по какой-то причине не выполняется.

Спасибо

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Хм ... Мне кажется, вы ожидаете получить данные, когда пользователь нажмет на FlatButton.

Давайте посмотрим, что происходит:

  1. нажмите на FlatButton
  2. Создание экземпляра StreamBuilder
  3. Начните получать данные из Firestore
  4. Сделайте немного магии Firestore, дата обновления
  5. Затем закройте диалог по navigator.pop()

Проблема: Вы звоните navigator.pop() сразу после установления StreamBuilder. StreamBuilder должен немного подождать, чтобы получить данные. Если вы выдвигаете маршрут, и с этим уничтожаете диалоговое окно с предупреждением, обратный вызов компоновщика вызываться не будет. Итак, фактическая последовательность происходящих событий: Tap -> Instantiate StreamBuilder -> pop route

Рекомендация: зачем переносить вычисления в StreamBuilder? Вы могли бы сделать:

onPressed: () {
  Firestore.instance.collection('users')/*...*/.snapshots().then((snapshot) async {
    // then branch is executed once snapshot is retrieved from firestore
    var TypeSelfFilters = snapshot.data;
    // do some more computation and magic
    await Firestore.instance.collection/*...*/.updateData();
    // wait for updateData to finish
    Navigator.pop(context); // this context is not the context inside the StreamBuilder
  });
}
0 голосов
/ 02 июня 2019

Благодаря Даниэлю В. я нашел решение:

var myData = Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').snapshots().first;
                myData.then((snapshot) async {
                  var TypeSelfFilters = snapshot.data;
                  List<String> ListOfTypeSelf = List.from(TypeSelfFilters["Personer"]);
                  ListOfTypeSelf.add("bare en test");
                  Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').updateData({'Personer': ListOfTypeSelf});
                  Navigator.pop(context); // this context is not the context inside the StreamBuilder
                });
                }
                )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...