不触摸屏幕,FutureBuilder无法正常工作

时间:2019-11-06 12:43:32

标签: sqlite flutter

我有以下情况:屏幕上有一个按钮,它将数据添加到db。还有未来的建设者,其中有未来的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 :(得分:0)

您的代码有两个问题:

  1. 您正在构建函数中获取Future对象,这不是正确的方法。每次重新构建窗口小部件时,都会得到一个新的Future对象(因此,也许在您触摸/滚动时它会重新构建)。您应该将Future对象存储在Widget的状态中。
  

将来一定要早一些,例如在State.initState,State.didUpdateConfig或State.didChangeDependencies中。构造FutureBuilder时,不得在State.build或StatelessWidget.build方法调用期间创建它。

  1. 您正在使用FutureBuilder,但是您希望FutureBuilder在更改某些数据后能够重建。 FutureBuilder不能那样工作,只能重建一次-解析Future值时(如果将Future对象存储在State中。在这种情况下,它总是在重建时获得新的Future)。您可能要使用StreamBuilder。它将允许您将新数据添加到数据流中。 StreamBuilder将触发流更改并自动重建。

如果没有,您应该阅读有关BloC体系结构的信息。