在 Flutter 中接收未来数据(共享首选项)时出现问题



我正在尝试在共享首选项中保存Switch的值。这是我的代码:

bool isDarkTheme;
static const String KEY_DARK_THEME = "dark";
void setTheme(bool value) async {
SharedPreferences pref = await SharedPreferences.getInstance();
isDarkTheme = value;
pref.setBool(KEY_DARK_THEME, isDarkTheme);
print("DARKSet? $isDarkTheme");
}
void getTheme() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
isDarkTheme = sharedPreferences.getBool(KEY_DARK_THEME);
print("dark? $isDarkTheme");
}
@override
void initState() {
// TODO: implement initState
super.initState();
print("MYINIT");
getTheme();
}

在构建方法中...

@override
Widget build(BuildContext context) {
print("BUILD $isDarkTheme");
...
...
ListTile(
title: Text("Dark Theme"),
trailing: Switch(
value: isDarkTheme ?? false,
onChanged: (val) {
setState(() {
setTheme(val);
});
},
),
),
...
...
}

虽然我在调试控制台中得到了正确的值,但 Switch 小部件没有相应地更改。我发现build()方法在从SharedPrefernces获取值之前运行,因此 Switch 小部件没有从共享首选项获取值。如何解决这个接收Future价值的问题?

你有两个选择

1(. 我认为当你从 SharedPpreferred 获得值时,你只需调用 setState(( 方法

void getTheme() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
setState(() {
isDarkTheme = sharedPreferences.getBool(KEY_DARK_THEME);
print("dark? $isDarkTheme");
});}

2( 您可以使用 Provider 进行状态管理,因此,当 isDarkTheme 值发生更改时,将调用 notifyListener,并且您的构建方法是重新生成,并且您会看到更改

您的主要问题是,每当您想要存储或检索值时,您都会检索SharedPreferences实例,此外您还使用它的两个实例(prefsharedPreferences(:

使用单独的函数检索单个SharedPreferences实例:

SharedPreferences pref ;
Future loadPreferences() async {
pref = await SharedPreferences.getInstance();
}

然后修改getThemesetTheme

void setTheme(bool value) async {
isDarkTheme = value;
pref.setBool(KEY_DARK_THEME, isDarkTheme);
print("DARKSet? $isDarkTheme");
}
void getTheme() async {
isDarkTheme = pref.getBool(KEY_DARK_THEME);
print("dark? $isDarkTheme");
}

此外,在初始化期间调用loadPreferences,因此在调用build时将加载pref

@override
void initState() {
super.initState();
print("MYINIT");
loadPreferences().then((_){
getTheme();
}); 
}

最新更新