【问题标题】:how to update the FutureBuilder text every time the shared-preference is updated每次更新共享首选项时如何更新 FutureBuilder 文本
【发布时间】:2023-03-30 12:23:02
【问题描述】:

我想将时间数据保存在移动本地卡里,这样当应用程序关闭和打开时,我希望它显示出来。该部分有效,但是当按下按钮设置新时间时,它不会更新为新设置的 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 <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))
      ],
    )
);
}

【问题讨论】:

    标签: flutter mobile sharedpreferences flutter-futurebuilder


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2021-01-18
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多