我正在尝试将Switch
的值保存在SharedPreferences中。这是我的代码:
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
值的问题?
答案 0 :(得分:2)
您有两个选择
1)。我认为当您从SharedPreference获得价值时,您只需调用setState()方法
<div class="grid-container">
<div class="item1">
<div class="object">
</div>
</div>
<div class="item2">
<h2>Title</h2>
</div>
<div class="item3">
<p style="margin: 0px;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
<p>
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</p>
</div>
</div>
2)您可以将Provider用于StateManagement,这样,当isDarkTheme值更改时,将调用notifyListener,并且您的构建方法将重新构建,并且您会看到更改
答案 1 :(得分:0)
您的主要问题是,无论何时要存储或检索值,您都在检索SharedPreferences
实例,此外您还使用了它的两个实例(pref
和{{ 1}}):
使用单独的函数检索单个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