如何将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);

 // ...
}