每次更新共享首选项时如何更新 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,流构建器内的重建将自动进行。
我想将时间数据保存在移动 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,流构建器内的重建将自动进行。