Почему моя функция builder выполняется дважды?

#firebase #flutter #dart #google-cloud-firestore

#firebase #флаттер #dart #google-облако-firestore

Вопрос:

Я хочу проверить, существует ли коллекция с этим именем пользователя и типом учетной записи, это означает, что я хочу узнать, является ли пользователь премиум.

Вывод при запуске приложения: ok user ok model

Почему он печатает «ok» дважды, и похоже, что снимок имеет и не имеет никаких данных?

Вот часть кода, если она ничего не говорит, я предоставлю полный класс:

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: isLoading
          ? Container(
              child: Center(child: CircularProgressIndicator()),
            )
          : StreamBuilder(
              stream: Firestore.instance
                  .collection('users')
                  .where('email', isEqualTo: email)
                  .where('account', isEqualTo: 'model')
                  .snapshots(),
              builder: (context, snapshot) {
                print('ok');
                if (!snapshot.hasData) {
                  box.put('account', 'user');
                  print(box.get('account'));
                } else {
                  box.put('account', 'model');
                  print(box.get('account'));
                }
                return Container(...
  

Заранее благодарю вас и, может быть, есть самый простой способ узнать, существует ли коллекция с такими данными?

Комментарии:

1. isLoading возможно, было слишком много раз, что приводило к многократному запуску функции

Ответ №1:

Насколько я вижу, это работает так, как задумано. Когда ваш виджет впервые отображается, он начинает загружать данные stream из Firestore. В этот момент snapshot.hasData все еще false , поэтому он отображает ваш виджет с if блоком.

Затем, когда данные становятся доступными, поток обновляется, и это вызывает повторное отображение виджета. На данный момент snapshot.hasData есть true , поэтому он отображает ваш виджет с else помощью блока.