flutter - 如何将 Provider 的数据设置为 Flutter 中 SharedPreferences 中存储的数据?
问题描述
我将bool isDarkTheme
变量存储在我的General
提供程序类中,我可以随时访问它。
我想做的事情是保存用户的主题偏好,并且每当用户再次打开应用程序时,isDarkThem = false
我希望它从我存储的偏好中加载,而不是再次加载SharedPreferences
。
这是我的General
提供者代码:(我想它是可读的)
import 'package:shared_preferences/shared_preferences.dart';
class General with ChangeNotifier {
bool isDarkTheme = false;
General() {
loadDefaultTheme();
}
void loadDefaultTheme() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isDarkTheme = prefs.getBool("is_dark_theme") ?? false;
}
void reverseTheme() {
isDarkTheme = !isDarkTheme;
notifyListeners();
saveThemePreference(isDarkTheme);
}
void saveThemePreference(bool isDarkTheme) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("is_dark_theme", isDarkTheme);
}
}
解决方案
Dart 不支持异步构造函数,所以我认为我们应该在这里采取另一种方法。我通常会创建一个启动屏幕(或加载屏幕,不管你怎么称呼它)来在应用程序打开后立即加载所有基本数据。
但是如果你只想获取主题数据,你可以在 main 方法中使用 async/await 对:
void main() async {
WidgetsFlutterBinding.ensureInitialized(); // this line is needed to use async/await in main()
final prefs = await SharedPreferences.getInstance();
final isDarkTheme = prefs.getBool("is_dark_theme") ?? false;
runApp(MyApp(isDarkTheme));
}
之后,我们可以将那条主题数据传递给 General 构造函数:
class MyApp extends StatelessWidget {
final bool isDarkTheme;
MyApp(this.isDarkTheme);
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => General(isDarkTheme), // pass it here
child: MaterialApp(
home: YourScreen(),
),
);
}
}
我们也应该在 General 类中进行一些更改,省略了 loadDefaultTheme 方法。
class General with ChangeNotifier {
bool isDarkTheme;
General(this.isDarkTheme);
// ...
}
推荐阅读
- graph - 可以将有向图分解为列表吗?
- angular - MEAN 堆栈 - 在表格中显示数据时遇到问题
- ruby-on-rails - 在多个鼹鼠导轨之间共享 has_and_belongs_to_many 的最佳方式
- jquery - 多次打开时,SELECT2 选项在搜索文本中转换
- c# - 在 C# 中删除和替换字符串
- python - 在 Treeview tkinter 小部件中显示字典 - 不需要的字符串剪辑
- java - 我解决了这个问题,但结果是错误的。代码中需要改变什么?
- java - 如何从 Minecraft 编辑 .mca 文件?
- ios - XCUITest - 打开 iOS 设置并更改日期/时间
- r - 为什么 gsub/sub 不能代替“..”?