MaterialApp не распознает текущий язык, если не установлен в качестве родительского виджета - PullRequest
0 голосов
/ 09 мая 2019

У меня есть ThemeBloc в качестве родительского объекта, потому что я хочу динамически менять тему моего приложения. Это работает, но я просто хотел добавить локализации в приложение. И это не работает, как ожидалось. При запуске приложения MaterialApp не распознает язык системы. Но когда я меняю язык, MaterialApp распознает его правильно.

Я провел эксперимент. Я удалил BlocBuilder и установил MaterialApp в качестве корневого виджета. Тогда язык системы всегда определяется.

вывод доктора на трепет

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, v1.5.9-pre.69, on Linux, locale en_US.UTF-8)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Android Studio (version 3.4)
[✓] Android Studio (version 3.3)
[✓] IntelliJ IDEA Community Edition (version 2019.1)
[✓] Connected device (1 available)

• No issues found!

Плохое поведение:

void main() async {
  Fimber.plantTree(DebugTree());
  await DI.setup();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AuthBloc authBloc = DI.inject();
  ThemeBloc themeBloc = DI.inject();

  @override
  void initState() {
    authBloc.dispatch(InitAuthEvent());
    themeBloc.dispatch(InitThemeEvent());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder(
      bloc: themeBloc,
      builder: (_, themeState) {
        if (themeState is InitThemeState) {
          return MaterialApp(home: SplashScreen());
        } else if (themeState is AppThemeState) {
          return MaterialApp(
            localizationsDelegates: [
              AppLocalizationsDelegate(),
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate
            ],
            supportedLocales: AppLocalizations.supportedLocales,
            localeResolutionCallback: (locale, supportedLocales) {
              if (AppLocalizations.isSupported(locale)) {
                return Locale(locale.languageCode);
              } else {
                return Locale('en');
              }
            },
            theme: stateToTheme(themeState),
            home: _InitWidget()
          );
        }
      },
    );
  }

  ThemeData stateToTheme(AppThemeState state) {
    switch (state.currentTheme) {
      case AppTheme.light:
        return ThemeData.light();
      case AppTheme.dark:
        return ThemeData.dark();
    }
    return null;
  }
}

Хорошее поведение:

class _MyAppState extends State<MyApp> {
  AuthBloc authBloc = DI.inject();
  ThemeBloc themeBloc = DI.inject();

  @override
  void initState() {
    authBloc.dispatch(InitAuthEvent());
    themeBloc.dispatch(InitThemeEvent());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
          return MaterialApp(
            localizationsDelegates: [
              AppLocalizationsDelegate(),
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate
            ],
            supportedLocales: AppLocalizations.supportedLocales,
            localeResolutionCallback: (locale, supportedLocales) {
              if (AppLocalizations.isSupported(locale)) {
                return Locale(locale.languageCode);
              } else {
                return Locale('en');
              }
            },
            home: _InitWidget()
  }
}
``
...