Flutter接收Future数据(SharedPreferences)的问题
Problem in receiving Future data (SharedPreferences) in Flutter
我试图在 SharedPreferences 中保存 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();
}
并在 Build 方法中...
@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 小部件未从 SharedPreferences 获取值。如何解决这个接收Future
值的问题?
您的主要问题是,每当您想存储或检索一个值时,您都在检索 SharedPreferences
实例,除此之外,您还使用了它的两个实例(pref
和sharedPreferences
) :
使用单独的函数检索单个 SharedPreferences
实例:
SharedPreferences pref ;
Future loadPreferences() async {
pref = await SharedPreferences.getInstance();
}
然后修改getTheme
和setTheme
:
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
,因此 pref
将在调用 build
时加载:
@override
void initState() {
super.initState();
print("MYINIT");
loadPreferences().then((_){
getTheme();
});
}
你有两个选择
1).我想当你从 SharedPreference 获得价值时,你只需调用 setState() 方法
void getTheme() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
setState(() {
isDarkTheme = sharedPreferences.getBool(KEY_DARK_THEME);
print("dark? $isDarkTheme");
});}
2) 您可以将 Provider 用于 StateManagement,这样,当 isDarkTheme 值更改时,将调用 notifyListener 并且您的构建方法是 rebuild,您会看到更改
我试图在 SharedPreferences 中保存 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();
}
并在 Build 方法中...
@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 小部件未从 SharedPreferences 获取值。如何解决这个接收Future
值的问题?
您的主要问题是,每当您想存储或检索一个值时,您都在检索 SharedPreferences
实例,除此之外,您还使用了它的两个实例(pref
和sharedPreferences
) :
使用单独的函数检索单个 SharedPreferences
实例:
SharedPreferences pref ;
Future loadPreferences() async {
pref = await SharedPreferences.getInstance();
}
然后修改getTheme
和setTheme
:
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
,因此 pref
将在调用 build
时加载:
@override
void initState() {
super.initState();
print("MYINIT");
loadPreferences().then((_){
getTheme();
});
}
你有两个选择
1).我想当你从 SharedPreference 获得价值时,你只需调用 setState() 方法
void getTheme() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
setState(() {
isDarkTheme = sharedPreferences.getBool(KEY_DARK_THEME);
print("dark? $isDarkTheme");
});}
2) 您可以将 Provider 用于 StateManagement,这样,当 isDarkTheme 值更改时,将调用 notifyListener 并且您的构建方法是 rebuild,您会看到更改