目录
1. Locale配置
2. 用户切换/启动自动加载缓存里面的locale
由于最近在开发app国际化设置的时候遇到一些问题,所以做出一些总结。
1. Locale配置
具体的初始化配置可以参考文档:i18n | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
值得注意的是这里记得要加上自己的delegate,不然启动会有context相关的问题。(dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _HomeViewState.initState() completed.)
作为一些补充也可以参考:Flutter实现国际化(多语言)_flutter 国际化-CSDN博客
2. 用户切换/启动自动加载缓存里面的locale
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Load the cached locale before the app starts
Storage().getData(CommonSpKey.locale.value).then((cachedLanguageCode) {
runApp(ChangeNotifierProvider(
create: (_) {
final provider = LocaleProvider();
provider.init(Locale(cachedLanguageCode ?? 'zh'));
return provider;
},
child: MyApp(cachedLocale: Locale(cachedLanguageCode ?? 'zh')),
),);
});
}
Future<String?> getData(String key) async {
final preference = await SharedPreferences.getInstance();
return preference.getString(key);
}
简单来说,这里是在main.dart里面启动的时候加载缓存的语言,然后通过MyApp这个widget的localeResolutionCallback来设置当前显示的locale。
updatedLocale是用户当前选择的所以优先显示,
如果没有就读取cacheLocale的,
如果还是没有就读取系统环境的locale。
final Locale? updatedLocale = context.watch<LocaleProvider>().currentLocale;
--
localeResolutionCallback: (locale, supportedLocales) {
if (updatedLocale != null) {
// print('---------> 1: ${updatedLocale.languageCode}');
return Locale(updatedLocale.languageCode);
}
if(cachedLocale != null) {
// print('---------> 2: ${cachedLocale!.languageCode}');
return cachedLocale;
}
// print('---------> 3');
if (locale?.countryCode == 'US') {
return const Locale('en', 'US');
} else {
return const Locale('zh', 'CN');
}
},
locale: cachedLocale, // Default locale