我将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));
}
之后,我们可以将这段主题数据传递给通用构造函数:
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);
// ...
}