Во Flutter, как я могу читать данные из дочернего виджета, когда обратные вызовы недоступны в методе сборки дочернего элемента? - PullRequest
0 голосов
/ 26 мая 2020
• 1000 в список:
class ChildWidgetState extends State<ChildWidget> {
....
Widget build(BuildContext context) {
    return StreamBuilder<List<DocumentSnapshot>>(
        stream: stream,
        builder: (context, snapshots) {
              if (snapshots.connectionState == ConnectionState.active &&
                  snapshots.hasData) {
                      List<DocumentSnapshot> childData = [];
                      for (var x in snapshots.data) {
                          //do something else with snapshot data
                          childData.add(x);
                       }

Я попытался использовать функцию обратного вызова, в которой я уведомляю родительский виджет о необходимости refre sh, но это дает ошибку setState() or markNeedsBuild() called during build, поскольку она устанавливаетStates во время метода сборки ChildWidget. У меня определенно есть данные в моем streambuilder, поскольку они используются где-то еще без каких-либо проблем в настоящее время. использование глобальных переменных не одобряется. Будет ли также плохой практикой добавить список childData в пакет базы данных, такой как Hive, а затем прочитать его в моем ParentWidget? Я не обязательно хочу перестраивать родительский виджет - просто читайте данные в дочернем виджете, когда я нажимаю кнопку AppBar.

Спасибо.

1 Ответ

1 голос
/ 26 мая 2020

Вы можете использовать поставщик для получения данных в родительском виджете

Provider(
  create: (_) => MyModel(),
  child: ParentWidget()
)

при использовании ChildWidget

data=Provider.of<MyModel>(context);

и MyModel() может быть классом данных, содержащим данные, которые вы хотите получить. ваш родительский appBar.

Теперь в Steam Builder вы можете использовать

data.childData=newData

И после этого использовать

data=Provider.of<MyModel>(context);

в родительском виджете и

data.childData

Будет newdata хочешь.

...