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