Flutter извлекает данные в списке с помощью FutureBuilder

на данный момент я пытаюсь понять некоторые основы извлечения данных с помощью флаттера и firestore. В моем случае я хочу получить данные один раз, поэтому я решил выбрать FutureBuilder вместо StreamBuilder.

Теперь, когда я помещаю оператор печати в свое дерево виджетов, я замечаю, что каждый раз, когда я вызываю свою функцию, конечно, все дерево перестраивается. Теперь я хочу использовать Consumer, чтобы перезагружался только мой Listview.Builder, но я не могу заставить его работать должным образом. Дерево виджетов все еще перестраивается. Надеюсь, кто-то может мне помочь.

Consumer<SongProvider>(builder: (context, sProvider, _) {
                  return FutureBuilder(
                      future: songFuture,
                      builder: (context, snapshot) {
                      

                          switch (snapshot.connectionState) {
                            case ConnectionState.none:
                            case ConnectionState.waiting:
                              return Align(
                                alignment: Alignment.center,
                                child: CircularProgressIndicator()
                              );
                            case ConnectionState.done:
                              if (snapshot.hasError) {
                                return Text('Error: ${snapshot.error}');
                              } else {

                                return ListView.builder(
                          itemCount: snapshot.data.length,
                          itemBuilder: (context, index) {
                            return Text(
                                snapshot.data[index]['songName'].toString());
                          });
                              }
                          }

                          
                    }
                  );
            }))
      ],
    )));
  }
}

Как я могу заставить Consumer работать сейчас? Я думаю, мне нужно заменить его снимками, но я не знаю, как и откуда я получаю данные. пожалуйста помоги

Потребители работают только тогда, когда ваш виджет находится под вашим провайдером, вы можете прочитать больше здесь: medium.com/flutter-community/…

xion 14.12.2020 11:35

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

Marcel Dz 14.12.2020 12:18
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
2
437
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте атрибут для будущего как Future<dynamic> yourDataFuture; и инициализируйте его в initState как

void initState() {
   super.initState();
   yourDataFuture= getData(); // get Data will returns a future
}

Затем назначьте эту переменную FutureBuilder как будущее как

...... rest of the code...

future: yourDataFuture,

....... rest of the code....

Еще одна вещь, которую вам нужно обработать ConnectionStates, чтобы предотвратить множественные вызовы. В вашем коде будущий строитель будет звонить 3 раза. один для none, второй раз для waiting и третий раз для done.Читать. Итак, создайте список, когда состояние соединения достигнет done

Привет, спасибо за твой код. я отредактировал свой вопрос. Я работал с состояниями подключения, теперь он загружается только после завершения. В любом случае, как я могу заставить Потребителя работать сейчас? Я думаю, мне нужно заменить его снимками, но я не знаю, как и откуда я получаю данные. пожалуйста помоги

Marcel Dz 14.12.2020 12:13

Для каких целей вы хотите использовать Consumer?

Faiizii Awan 14.12.2020 12:27

Я хочу перестроить listviewbuilder только в том случае, если данные изменились, а не перестраивать всю страницу.

Marcel Dz 14.12.2020 12:30
pub.dev/documentation/provider/latest/provider/… вы неправильно используете Consumer. поместите остальную часть дерева виджетов в качестве дочернего элемента потребителя и перечислите внутри построителя потребителя. прочитайте ссылку выше
Faiizii Awan 14.12.2020 12:33

Теперь я думаю, что это правильно, я реализовал changenotifierprovider в верхней части своего приложения. теперь в документации сказано, что потребитель должен находиться в ближайшей возможной позиции к виджету, содержащему данные. Теперь нам нужно изменить snapshot.data[index]['songName'].toString()); в sProvider.foo.value . Но я не знаю, нужно ли мне также менять все переменные моментальных снимков, например, в построителе FutureBuilder: (контекст, снимок) {}, и я не получаю никаких значений от db.getSongsOnce(); чтобы получить sProvider.foo.value

Marcel Dz 14.12.2020 12:52

Другие вопросы по теме