Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在Flatter中的共享首选项中存储主题_Flutter_Dart_Colors_Themes_Sharedpreferences - Fatal编程技术网

Flutter 如何在Flatter中的共享首选项中存储主题

Flutter 如何在Flatter中的共享首选项中存储主题,flutter,dart,colors,themes,sharedpreferences,Flutter,Dart,Colors,Themes,Sharedpreferences,在这里,我有一个屏幕,我有一些按钮,当我按下按钮时,它将改变应用程序的颜色,但当我重新启动应用程序时,它将重置。我希望它不会重置,直到我改变了应用程序的颜色。因此,我想在共享首选项中存储主题数据,并从共享首选项中获取主题数据,因此每当我重新启动应用程序时,它都需要从共享首选项中获取主题 这是我试过的一些代码 MEBLOCK.dart class ThemeBloc extends Bloc<ThemeEvent, ThemeState> { @override ThemeSt

在这里,我有一个屏幕,我有一些按钮,当我按下按钮时,它将改变应用程序的颜色,但当我重新启动应用程序时,它将重置。我希望它不会重置,直到我改变了应用程序的颜色。因此,我想在共享首选项中存储主题数据,并从共享首选项中获取主题数据,因此每当我重新启动应用程序时,它都需要从共享首选项中获取主题

这是我试过的一些代码

MEBLOCK.dart

class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
  @override
  ThemeState get initialState =>
      ThemeState(themeData: appThemeData[AppTheme.GreenLight]);

  @override
  Stream<ThemeState> mapEventToState(
    ThemeEvent event,
  ) async* {
    if (event is ThemeChanged) {
      yield ThemeState(themeData: appThemeData[event.theme]);
    }
  }
}
abstract class ThemeEvent extends Equatable {
  ThemeEvent([List props = const <dynamic>[]]) : super(props);
}

class ThemeChanged extends ThemeEvent {
  final AppTheme theme;

  ThemeChanged({
    this.theme,
  }) : super([theme]);
}
@immutable
class ThemeState extends Equatable {
  final ThemeData themeData;

  ThemeState({
    @required this.themeData,
  }) : super([themeData]);
}
enum AppTheme {
  GreenLight,
  GreenDark,
  BlueLight,
  BlueGrey,
  Amber,
}

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

class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
  @override
  ThemeState get initialState =>
      ThemeState(themeData: appThemeData[AppTheme.GreenLight]);

  @override
  Stream<ThemeState> mapEventToState(
    ThemeEvent event,
  ) async* {
    if (event is ThemeChanged) {
      yield ThemeState(themeData: appThemeData[event.theme]);
    }
  }
}
abstract class ThemeEvent extends Equatable {
  ThemeEvent([List props = const <dynamic>[]]) : super(props);
}

class ThemeChanged extends ThemeEvent {
  final AppTheme theme;

  ThemeChanged({
    this.theme,
  }) : super([theme]);
}
@immutable
class ThemeState extends Equatable {
  final ThemeData themeData;

  ThemeState({
    @required this.themeData,
  }) : super([themeData]);
}
enum AppTheme {
  GreenLight,
  GreenDark,
  BlueLight,
  BlueGrey,
  Amber,
}

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

您可以简单地保存/检索一个主题id,该id可用于识别启动应用程序时选择的主题,如

class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {

  // at this point you should be already have a mainSharedPreferences already initialized, could be in SplashScreen
  // to prevent async calls in the initialState

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

  @override
  Stream<ThemeState> mapEventToState(
    ThemeEvent event,
  ) async* {
    if (event is ThemeChanged) {
      await _persistTheme(event.theme);
      yield ThemeState(themeData: appThemeData[event.theme]);
    }
  }

  _persistTheme(AppTheme theme) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setInt("selectedThemeIndex", theme.index);
    // or you could save the theme.toString()
    // prefs.setString("selectedTheme", theme.toString());
  }
}

您可以将其序列化/反序列化为JSONA,我如何存储主题id??从哪里我可以得到主题ID?你可以定义你自己的主题ID,例如ID:1=>theme1,等等@RutvikGumasana我编辑了我的答案,这可以让你开始谢谢你这么多我会尝试代码,让你知道:)@SlahLayouni嗨,我有一个关于你的解决方案的问题。如何同步加载SharedReference?我也有同样的问题,我想从SharedReferences加载语言和主题,并将其保存在initialState中。谢谢!