每次更新共享首选项时如何更新 FutureBuilder 文本

how to update the FutureBuilder text every time the shared-preference is updated

我想将时间数据保存在移动 localcaly 中,所以每当应用程序关闭并打开支持时,我希望它能够显示出来。该部分有效,但是当按下按钮设置新时间时,它不会更新到新设置的 sharedprefence 以显示而不是负载或新时间。

这是每次按下按钮时运行的函数

void timeInPush()async{
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
String now =await new DateFormat.yMd().add_Hm().format(new DateTime.now());
String day =await new DateFormat.d().add_Hm().format(new DateTime.now());
sharedPreferences.setString("timeIn", now);
sharedPreferences.setString("timeOut",null);
sharedPreferences.reload();
}

这是 Future 构建器的函数

  Future <String> timeShowtimein()async{
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
return Future.delayed(Duration(seconds: 1),()async{
  return await sharedPreferences.getString("timeIn");
});

}

这是 UI 生成器

  Container  timeText(){
return Container(
    child:Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        FutureBuilder(
            future:timeShowtimein() ,
            builder: (context, snapshot){
              if(snapshot.hasData){
                return Text("${snapshot.data}");
              }else{
                return Text("Loading");
              }
            }),
        SizedBox(
          width:20,
        ),
        Text("$Timeout",style:TextStyle(
            color: Colors.redAccent,
            fontSize: 15.0))
      ],
    )
);
}

调用 timeInPush() 设置共享首选项中的值。问题是它不会让 FutureBuilder 知道发生了变化。

sharedPreferences.reload() 将首选项与本机应用程序重新同步,以确保 dart 方面没有未决的更改(在文档中有说明)

尝试将您的小部件转换为有状态的,并在设置值后在 timeInPush() 方法中调用 setState(() { })。这可能会强制重建并再次启动未来的构建器。

问题是每次重建小部件时它可能会显示一两帧的加载。您可以使用 initialData 属性 = 一个附加变量来解决此问题,每次您在共享首选项中设置值时可能需要手动更新该变量,但这只会使代码更加复杂。而且,每次更新sharedPrefs时,都需要调用setState强制重建。

我会推荐rx_shared_preferences包。它建立在 shared_preferences 包之上,能够处理流。使用 StreamBuilder,您只需更新 SharedPreferences,流构建器内的重建将自动进行。