FutureBuilder не работает, не касаясь экрана - PullRequest
1 голос
/ 06 ноября 2019

У меня следующая ситуация: на экране есть кнопка, которая добавляет данные в БД. И есть будущий строитель, у которого есть будущее getDataFromDB. Когда я добавляю данные по кнопке, будущий строитель не получает данные из БД. И когда я делаю несколько движений на экране, он работает правильно. В чем дело? Вот код:

FutureBuilder(
                  future: DatabaseManager().findAllCaloriesForSelectedDate(currentDate),
                  builder: (context, AsyncSnapshot<int> snapshot) {
                    if (snapshot.hasData) {
                      _caloriesCurrent = snapshot.data;
                      return AnimatedCircularChart(
                        size: Size(constraints.maxWidth * 0.8, constraints.maxWidth * 0.8),
                        initialChartData: <CircularStackEntry>[
                          CircularStackEntry(
                            <CircularSegmentEntry>[
                              CircularSegmentEntry(
                                currentProgress,
                                Color(AppColors.brandViolet),
                              ),
                              CircularSegmentEntry(
                                100 - currentProgress,
                                Color(AppColors.layoutBackgroundColor),
                              ),
                            ],
                          ),
                        ],
                        chartType: CircularChartType.Radial,
                        edgeStyle: SegmentEdgeStyle.round,
                        percentageValues: true,
                      );
                    } else {
                      return Container();
                    }
                  },
                )

Буду признателен за любую помощь. Заранее спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

С вашим кодом есть две проблемы:

  1. Вы получаете объект Future в функции сборки, что не является правильным способом сделать это. Каждый раз, когда ваш виджет перестраивается, вы получаете новый объект Future (так что, возможно, он перестраивается, когда вы нажимаете / прокручиваете). Вы должны хранить объект Future в State of Widget.

Будущее должно быть получено ранее, например, во время State.initState, State.didUpdateConfig или State.didChangeDependencies. Он не должен быть создан во время вызова метода State.build или StatelessWidget.build при создании FutureBuilder.

Вы используете FutureBuilder, но ожидаете, что FutureBuilder будет перестроен после изменения некоторых данных. FutureBuilder не работает таким образом и перестраивает только один раз - когда значение Future разрешено (если вы храните объект Future в State. В вашем случае он всегда получает новое Future при перестроении). Вы, вероятно, хотите использовать StreamBuilder. Это позволит вам добавлять новые данные в поток данных. StreamBuilder будет запускать изменения потока и автоматически перестраивать.

Вы должны прочитать об архитектуре BloC, если вы этого не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...