关于Flutter应用国际化语言的设置

目录

[1. Locale配置](#1. Locale配置)

[2. 用户切换/启动自动加载缓存里面的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

Dart 复制代码
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')),
    ),);
  });
}
Dart 复制代码
Future<String?> getData(String key) async {
    final preference = await SharedPreferences.getInstance();
    return preference.getString(key);
  }

简单来说,这里是在main.dart里面启动的时候加载缓存的语言,然后通过MyApp这个widget的localeResolutionCallback来设置当前显示的locale。

updatedLocale是用户当前选择的所以优先显示,

如果没有就读取cacheLocale的,

如果还是没有就读取系统环境的locale。

Dart 复制代码
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
相关推荐
江上清风山间明月7 小时前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
Zsnoin能18 小时前
flutter国际化、主题配置、视频播放器UI、扫码功能、水波纹问题
flutter
早起的年轻人19 小时前
Flutter CupertinoNavigationBar iOS 风格导航栏的组件
flutter·ios
HappyAcmen19 小时前
关于Flutter前端面试题及其答案解析
前端·flutter
coooliang1 天前
Flutter 中的单例模式
javascript·flutter·单例模式
coooliang1 天前
Flutter项目中设置安卓启动页
android·flutter
JIngles1231 天前
flutter将utf-8编码的字节序列转换为中英文字符串
java·javascript·flutter
B.-1 天前
在 Flutter 中实现文件读写
开发语言·学习·flutter·android studio·xcode
freflying11192 天前
使用jenkins构建Android+Flutter项目依赖自动升级带来兼容性问题及Jenkins构建速度慢问题解决
android·flutter·jenkins
机器瓦力2 天前
Flutter应用开发:对象存储管理图片
flutter