如何将Provider的数据设置为Flutter中SharedPreferences中存储的数据?
How to set Provider's data to data that stored in SharedPreferences in Flutter?
我将 bool isDarkTheme
变量存储在我的 General
提供程序 class 中,我可以随时访问它。
我想做的是保存用户的主题偏好,每当用户再次打开应用程序时,而不是再次打开应用程序 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 class 中稍微更改一下,省略了 loadDefaultTheme 方法。
class General with ChangeNotifier {
bool isDarkTheme;
General(this.isDarkTheme);
// ...
}
我将 bool isDarkTheme
变量存储在我的 General
提供程序 class 中,我可以随时访问它。
我想做的是保存用户的主题偏好,每当用户再次打开应用程序时,而不是再次打开应用程序 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 class 中稍微更改一下,省略了 loadDefaultTheme 方法。
class General with ChangeNotifier {
bool isDarkTheme;
General(this.isDarkTheme);
// ...
}