У меня есть 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()
}
}
``