当前位置: 首页 > article >正文

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

目录

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


http://www.kler.cn/a/464598.html

相关文章:

  • Elasticsearch:Lucene 2024 年回顾
  • Cursor连接腾讯云Cloud Studio开发环境
  • 时序优化方法
  • CG顶会论文阅读|《科技论文写作》硕士课程报告
  • (二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?
  • 自学记录鸿蒙API 13:实现多目标识别Object Detection
  • 复合机器人正以其高效、精准、灵活的特点,逐渐在汽车装配线上崭露头角
  • 使用XGBoost算法进行机器学习任务:从理论到实践
  • 树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
  • 戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
  • pyspark执行group by操作
  • df.drop()
  • 【剪映绿化版】剪映免费绿色版,全部功能可用
  • Centos7中安装X11vnc
  • 基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现
  • 基于Springboot + vue实现的校园周边美食探索及分享平台
  • scrapy 教程
  • 【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站
  • Excel 身份证号计算年龄
  • super_vlan
  • 基于springboot的社区维修平台
  • 【Go学习】-01-2-常见类型及关键字
  • 我的线代观-秩(向量,矩阵)
  • 船用能源管理系统:绿色航运的未来之匙
  • 计算机网络•自顶向下方法:OSPF、BGP与ICMP协议
  • 刷服务器固件