为什么我的主题更改脚本无法正常工作

问题描述 投票:0回答:1

主题更改容器开关具有相反的值。我刚刚启动应用程序,无法更改开关的值。我使用了一个基本的可相等的肘来执行更改主题的逻辑,并且在这个肘中将数据保存到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,),
            );
          },
        )
    );

  }
}
flutter dart sharedpreferences cubit flutter-cubit
1个回答
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(或者你可能会遇到喜欢压力测试的测试人员)。

© www.soinside.com 2019 - 2024. All rights reserved.