对于未来的读者,您可以通过以下方式实现这一目标:
Locale 由 localeResolutionCallback 函数返回的结果定义,在 MaterialApp 小部件中。
就我而言,我将final Locale defaultValue; 传递给我的应用根目录,即树中的第一个小部件(在runApp() 中声明)。
那时,我只是做这个验证:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';
import '../../localization.dart';
import '../views/home_view.dart';
class App extends StatelessWidget {
App({Key key, this.defaultLanguage}) : super(key: key);
final Locale defaultLanguage;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeView(),
localizationsDelegates: [
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', null),
const Locale('pl', null),
],
localeResolutionCallback: (locale, supportedLocales) {
if (defaultLanguage != null) {
Intl.defaultLocale = defaultLanguage.toLanguageTag();
return defaultLanguage;
}
if (locale == null) {
Intl.defaultLocale = supportedLocales.first.toLanguageTag();
return supportedLocales.first;
}
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale.languageCode) {
Intl.defaultLocale = supportedLocale.toLanguageTag();
return supportedLocale;
}
}
Intl.defaultLocale = supportedLocales.first.toLanguageTag();
return supportedLocales.first;
},
);
}
}
如果defaultLanguage 由上面的 bloc 传递,那么它会在应用程序中使用,否则它会执行标准验证以从设备中获取语言环境。
请记住,您可能需要通过验证 defaultLanguage 变量是否属于受支持的语言环境来保护检查。就我而言,这是已处理的,所以这就是我不打扰的原因。