主题更改容器开关具有相反的值。我刚刚启动应用程序,无法更改开关的值。我使用了一个基本的可相等的肘来执行更改主题的逻辑,并且在这个肘中将数据保存到shared_preferences
class _AppState extends State<App> {
late SharedPreferences prefs;
bool? _isDark = false;
void loadPrefs() async {
prefs = await SharedPreferences.getInstance();
_isDark = prefs.getBool('theme');
}
@override
void initState() {
loadPrefs();
super.initState();
}
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers:[
BlocProvider(
create: (context) => ThemeCubit(),
),
BlocProvider(
create: (context) => FormControlCubit()
)
],
child:BlocBuilder<ThemeCubit, ThemeState>(
builder: (context, state) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: _isDark ?? state.isDark ? darkTheme : lightTheme,
home: const AuthGate(idx: 0,),
);
},
)
);
}
}
您应该记住一些注意事项:
当重写
initState
方法时 首先在第一行调用 super 方法,反之亦然,在处理时你应该先销毁孩子,所以你在最后一行调用 super.dispose
。
如果您使用 cubit 管理主题,请勿扩展
Equatable
或将 EquatableMixin
与状态的超类混合,特别是如果您使用一种状态管理主题。
示例:
sealed class ThemeManagerStates exetends Equatable{
// and you override the props getter here.
}
final class ThemeChangedState extends Equatable{
// and you override the props getter here.
}
当您扩展
Equatable
时,不会按顺序(一个接一个)发出对称状态。
所以,不要在用户可能会连续多次更改主题的状态下使用 equatable(或者你可能会遇到喜欢压力测试的测试人员)。