на данный момент я пытаюсь понять некоторые основы извлечения данных с помощью флаттера и 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
работать сейчас? Я думаю, мне нужно заменить его снимками, но я не знаю, как и откуда я получаю данные. пожалуйста помоги
Спасибо за предоставленный источник. Я отредактировал свой код и могу предположить, что я использую ChangenotifierProvider над своим деревом виджетов.
Создайте атрибут для будущего как 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
Привет, спасибо за твой код. я отредактировал свой вопрос. Я работал с состояниями подключения, теперь он загружается только после завершения. В любом случае, как я могу заставить Потребителя работать сейчас? Я думаю, мне нужно заменить его снимками, но я не знаю, как и откуда я получаю данные. пожалуйста помоги
Для каких целей вы хотите использовать Consumer?
Я хочу перестроить listviewbuilder только в том случае, если данные изменились, а не перестраивать всю страницу.
Теперь я думаю, что это правильно, я реализовал changenotifierprovider в верхней части своего приложения. теперь в документации сказано, что потребитель должен находиться в ближайшей возможной позиции к виджету, содержащему данные. Теперь нам нужно изменить snapshot.data[index]['songName'].toString()); в sProvider.foo.value . Но я не знаю, нужно ли мне также менять все переменные моментальных снимков, например, в построителе FutureBuilder: (контекст, снимок) {}, и я не получаю никаких значений от db.getSongsOnce(); чтобы получить sProvider.foo.value
Потребители работают только тогда, когда ваш виджет находится под вашим провайдером, вы можете прочитать больше здесь: medium.com/flutter-community/…