首页 > 解决方案 > 如何将 BloC AppTheme 的 id 放入颤动并防止主题重新启动

问题描述

我正在尝试使用flutter bloc来在我的flutter应用程序中获得动态主题。我已经能够做到,现在我正在尝试使用共享首选项保存主题的状态,为此我遵循其他 stackOverflow 用户的一些指导方针,现在我遇到了一个我不知道的问题不知道怎么解决。

首先,这是我如何能够使用 sharedPreferences 保存/获取我的应用程序主题的状态:

1 - >我将条件置于我的BloC状态以选择主题

  @override
  ThemeState get initialState => ThemeState(
      themeData: appThemeData[
          MyApp.mainSharedPreferences.getInt("selectedThemeIndex") ??
              AppTheme.GreenLight]);

2-在其他类中,我有我的 SharedPreference 方法

_persistTheme(AppTheme theme) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setInt("selectedThemeIndex", theme.index);

3 - 我的 mainSharedPreferences 已经在我的主类中初始化


class MyApp extends StatefulWidget {
  static SharedPreferences mainSharedPreferences;

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  @override
  void initState() { 
    super.initState();
    MyApp.mainSharedPreferences = await SharedPreferences.getInstance();
  }

//-----

4 - 我有这个用于获取/保存 sharedPreferences 的值


// to save value
MyApp.mainSharedPreferences.setInt("selectedThemeIndex", value);

// to get the saved value
MyApp.mainSharedPreferences.getInt("selectedThemeIndex");

我有 3 个主题,所以你可以在哪里看到“价值”,我根据我按下按钮时想要的主题放置 1、2 或 3

5 - 我的 3 个主题

enum AppTheme {
  GreenLight,
  GreenDark,
  BlueLight,

}

final appThemeData = {
  AppTheme.GreenLight: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.teal,
  ),
  AppTheme.GreenDark: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.orange,
  ),

  AppTheme.GreenDark: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.BlueLight,
  ),
};

所以,我的问题是;我如何为我的主题添加一个 ID,以便使用我的 sharedPreference 方法选择它们。如果不可能,我如何保存和获取我选择的主题,以防止每次运行应用程序时主题都重新启动。

标签: fluttersharedpreferencesbloc

解决方案


推荐阅读