在这里,我有一个屏幕,当我按下该按钮时,我会有一些按钮,它将改变应用程序的颜色,但是当我重新启动应用程序时,它将重置。我希望它不会重置,直到我从应用程序更改颜色。因此,我想将THemedata存储在共享首选项中,并且希望从共享首选项中获取主题数据,因此,每当我重新启动应用程序时,都需要从共享首选项中获取主题。
这是我尝试过的一些代码,
ThemeBloc.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]);
}
}
}
ThemeEvent.dart
abstract class ThemeEvent extends Equatable {
ThemeEvent([List props = const <dynamic>[]]) : super(props);
}
class ThemeChanged extends ThemeEvent {
final AppTheme theme;
ThemeChanged({
this.theme,
}) : super([theme]);
}
ThemeState.dart
@immutable
class ThemeState extends Equatable {
final ThemeData themeData;
ThemeState({
@required this.themeData,
}) : super([themeData]);
}
AppTheme.dart
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());
}
}
如何准备SharedPreferences以避免
Future<SharedPreferences>
class MyApp extends StatefulWidget {
static SharedPreferences mainSharedPreferences;
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
_loadApp() async {
MyApp.mainSharedPreferences = await SharedPreferences.getInstance();
// you can load here any other data or external data that your app might need
}
@override
void initState() {
super.initState();
_loadApp();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
localizationsDelegates: [
// ...
然后,您可以在应用程序中的任何地方使用它,就像这样
// to save value
MyApp.mainSharedPreferences.setInt("selectedThemeIndex", value);
// to get the saved value
MyApp.mainSharedPreferences.getInt("selectedThemeIndex");
关于flutter - 如何在 flutter 朔迷离的共享首选项中存储主题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59841810/