Flutter BLOC在使用multiblocprovider后无法重建

zbwhf8kr  于 12个月前  发布在  Flutter
关注(0)|答案(4)|浏览(124)

我使用Flutter BloC
我有两个块需要应用到应用程序(主题和语言)。
我使用MultiBlocProviderBuilder来尽可能地清除代码。
问题是,当我按下本地化屏幕和主题屏幕中的按钮时,应用程序不会重新构建
但当我重新启动应用程序时,我发现我按下的状态存储在共享首选项中
示例当前状态是黑暗主题,我按下轻主题按钮,应用程序仍然在黑暗主题,当我重新启动应用程序,它是在轻主题打开.
我该如何解决这个问题
我将代码添加到GitHub上的以下链接
https://github.com/MaxJan2010/flutter_bloc_starting_project
有人能帮忙吗?

nlejzf6q

nlejzf6q1#

我忘记传递appThemeTypelanguageCode的变量的问题
所以,覆盖 prop 是解决方案
本地化状态:

@override

List<Object> get props => [languageCode??''];

https://github.com/MaxJan2010/flutter_bloc_starting_project/blob/ed2c632d708bb74438290c87168990c88be02d2c/lib/logic/utility/app_localization/localization_state.dart#L24
在主题状态下,

@override

  List<Object> get props => [appThemeType??''];

https://github.com/MaxJan2010/flutter_bloc_starting_project/blob/ed2c632d708bb74438290c87168990c88be02d2c/lib/logic/utility/app_theme/app_theme_state.dart#L21C1-L22C48

bmp9r5qi

bmp9r5qi2#

使用ThemeBlocBuilder Package 主题,使用LocaleBlocBuilder Package 区域设置,这将使屏幕随着状态的变化而更新

4ngedf3f

4ngedf3f3#

您可以更有效地使用BlocBuilder小部件。下面是代码:

MultiBlocProvider(
        providers: [
          BlocProvider(
            create: (context) => AppConnectivityBloc(),
          ),
          BlocProvider(
            create: (context) =>
                AppLocalizationBloc()..add(AppLocalizationInitialEvent()),
          ),
          BlocProvider(
            create: (context) => AppThemeBloc()..add(AppThemeInitialEvent()),
          ),
        ],
        child: BlocBuilder<AppLocalizationBloc, AppLocalizationState>(
          builder: (context, langState) {
            var lang = langState is AppLocalizationChangeState
                ? langState.languageCode
                : 'en';
            return BlocBuilder<AppThemeBloc, AppThemeState>(
              builder: (context, themeState) {
                var theme = themeState is AppThemeChangeState
                    ? themeState.appThemeType
                    : 'light';
                return MaterialApp(
                  debugShowCheckedModeBanner: false,
                  theme:
                      theme == 'light' ? ThemeData.light() : ThemeData.dark(),
                  home: const MyHomeScreen(),
                  locale: Locale(lang!),
                  supportedLocales: const [
                    Locale('en'),
                    Locale('ar'),
                  ],
                  localizationsDelegates: [
                    AppLocalizations.delegate,
                    GlobalMaterialLocalizations.delegate, // For Android
                    GlobalWidgetsLocalizations
                        .delegate, // For Widget Directions
                    GlobalCupertinoLocalizations.delegate, // For IOS
                  ],
                  localeResolutionCallback: (deviceLocale, supportedLocales) {
                    for (var locale in supportedLocales) {
                      if (deviceLocale != null) {
                        if (deviceLocale.languageCode == locale.languageCode) {
                          return deviceLocale;
                        }
                      }
                    }
                    return supportedLocales.first;
                  },
                );
              },
            );
          },
        ));
gcxthw6b

gcxthw6b4#

在MaterialApp Widget上使用BlocBuilder

相关问题