Sqlite FutureBuilder没有';不触摸屏幕就不能工作

Sqlite FutureBuilder没有';不触摸屏幕就不能工作,sqlite,flutter,Sqlite,Flutter,我有以下情况:屏幕上有一个按钮,它将数据添加到数据库中。还有future builder,它具有futuregetDataFromDB。当我通过按钮添加数据时,future builder不会从DB获取数据。当我在屏幕上进行几次滑动时,它可以正常工作。怎么了代码如下: FutureBuilder( future: DatabaseManager().findAllCaloriesForSelectedDate(currentDate),

我有以下情况:屏幕上有一个按钮,它将数据添加到数据库中。还有future builder,它具有future
getDataFromDB
。当我通过按钮添加数据时,future builder不会从DB获取数据。当我在屏幕上进行几次滑动时,它可以正常工作。怎么了代码如下:

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();
                    }
                  },
                )
FutureBuilder(
future:DatabaseManager().FindAllColoriesForSelectedDate(currentDate),
生成器:(上下文,异步快照){
if(snapshot.hasData){
_卡路里电流=snapshot.data;
返回动画循环艺术(
大小:大小(constraints.maxWidth*0.8,constraints.maxWidth*0.8),
初始图表数据:[
循环跟踪条目(
[
循环段分录(
当前进展,
颜色(AppColors.brandViolet),
),
循环段分录(
100-目前的进展,
颜色(AppColor.layoutBackgroundColor),
),
],
),
],
图表类型:圆形图表类型。径向,
edgeStyle:分段edgeStyle.round,
percentageValues:true,
);
}否则{
返回容器();
}
},
)

我将感谢任何帮助。提前谢谢

您的代码有两个问题:

  • 您在构建函数中获取的是Future对象,这不是正确的方法。每次小部件重建时,您都会得到新的未来对象(因此,也许,当您触摸/滚动时,它会重建)。您应该将未来对象存储在小部件的状态中
  • 未来必须更早获得,例如在State.initState、State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或stateWidget.build方法调用期间创建它

  • 您正在使用FutureBuilder,但希望FutureBuilder在更改某些数据后重建。FutureBuilder不是这样工作的,当未来值被解析时,它只重建一次(如果您将未来对象存储在状态中。在您的情况下,它总是在重建时获得新的未来)。您可能想要使用StreamBuilder。它将允许您向数据流添加新数据。StreamBuilder将触发流更改并自动重建

  • 如果您没有读过BloC体系结构,您应该读一下。

    您的代码有两个问题:

  • 您在构建函数中获取的是Future对象,这不是正确的方法。每次小部件重建时,您都会得到新的未来对象(因此,也许,当您触摸/滚动时,它会重建)。您应该将未来对象存储在小部件的状态中
  • 未来必须更早获得,例如在State.initState、State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或stateWidget.build方法调用期间创建它

  • 您正在使用FutureBuilder,但希望FutureBuilder在更改某些数据后重建。FutureBuilder不是这样工作的,当未来值被解析时,它只重建一次(如果您将未来对象存储在状态中。在您的情况下,它总是在重建时获得新的未来)。您可能想要使用StreamBuilder。它将允许您向数据流添加新数据。StreamBuilder将触发流更改并自动重建

  • 如果您没有读过BloC架构,您应该阅读。

    请提供完整上下文的完整构建方法或小部件。请提供完整上下文的完整构建方法或小部件。非常感谢,但我不太理解您的第一点。你的意思是我应该将我的
    NutritionDataManager().GetDiscips(currentDate)
    移动到返回
    Future
    的单独方法,还是我错了?@SergeiMikhailovskii你调用FindAllCalcalIEsforSelectedDate方法返回你的Future对象。您不应该在内部构建中调用此方法。相反,在initState或其他地方调用它,并将结果Future对象存储在State中。但是如果我更新数据,当屏幕重建时,我需要显示更新的数据。在这种情况下我能做什么?@SergeiMikhailovskii您只需使用setState设置一个新的未来值-FutureBuilder将从State重建新的未来。但是我建议您使用StreamBuilder,这样您就可以向流中添加新数据,小部件就会重新生成。据我所知,StreamBuilder的工作原理与总线一样,不是吗?因此,我们将值放在一个小部件中,并将其放在另一个小部件中。但我怎样才能将回调传递给另一个我输入这个值的小部件呢?非常感谢,但我一点也不理解你的第一点。你的意思是我应该将我的
    NutritionDataManager().GetDiscips(currentDate)
    移动到返回
    Future
    的单独方法,还是我错了?@SergeiMikhailovskii你调用FindAllCalcalIEsforSelectedDate方法返回你的Future对象。您不应该在内部构建中调用此方法。相反,在initState或其他地方调用它,并将结果Future对象存储在State中。但是如果我更新数据,当屏幕重建时,我需要显示更新的数据。在这种情况下我能做什么?@SergeiMikhailovskii您只需使用setState设置一个新的未来值-FutureBuilder将从State重建新的未来。但是我建议您使用StreamBuilder,这样您就可以向流中添加新数据,小部件就会重新生成。据我所知,StreamBuilder的工作原理与总线一样,不是吗?所以,我们把值i