首页 > 解决方案 > 如何将 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);
  }
}

标签: flutterdartsharedpreferences

解决方案


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);

 // ...
}

推荐阅读