如何将提供程序的数据设置为存储在 Flutter 中共享首选项中的数据?



我将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);
// ...
}

相关内容

  • 没有找到相关文章

最新更新