MaterialApp doesn't rebuild after changing locale

29 Views Asked by At

MaterialApp isn't rebuilding after I change locale. It changes texts only after I use hot reload. I put print to see if the state of LanguageBloc rebuilds and it does.

I am using: intl: 0.18.1 Flutter 3.16.9

class _MyAppState extends State<MyApp> {
  @override
  Widget build(final BuildContext context) {
    final AppRouter _appRouter = dependencies.get();
    final ThemeBloc _themeBloc = dependencies.get();
    final LanguageBloc _languageBloc = dependencies.get();

    return BlocBuilder(
      bloc: _themeBloc,
      builder: (BuildContext context, ThemeState themeState) {
        return AppThemeWidget(
          theme: themeState.theme,
          child: BlocBuilder(
            bloc: _languageBloc,
            builder: (BuildContext context, LanguageState languageState) {
              print(languageState.currentLanguage.code);

              return MaterialApp.router(
                routerConfig: _appRouter.config(),
                locale: Locale.fromSubtags(languageCode: languageState.currentLanguage.code),
                localizationsDelegates: const [
                  S.delegate,
                  GlobalMaterialLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate,
                  GlobalCupertinoLocalizations.delegate,
                ],
                supportedLocales: S.delegate.supportedLocales,
                builder: BotToastInit(),
              );
            },
          ),
        );
      },
    );
  }
}

I tried returning whole Locale object from state, different Locale constructors and using setState. None of those worked.

1

There are 1 best solutions below

0
diegoveloper On

Try adding a key to your MaterialApp widget based on your current language in order to force the rebuild:

MaterialApp.router( 
  key: ValueKey(languageState.currentLanguage.code),
  routerConfig: _appRouter.config(),
  locale: Locale.fromSubtags(languageCode: languageState.currentLanguage.code),
  ...
)