【Flutter】多语言方案二:GetX 版

介绍

多语言方案:GetX版,需要手动自定义字符串引用常量,优点不需要自己管理状态。


目录

  • 介绍
  • 运行效果
  • 一、安装 GetX
  • 二、使用
    • 1.语言配置 在lib/core下创建一个language文件夹,文件夹下创建一个local.dart文件
    • 2.language文件夹下创建一个messages.dart文件
    • 3. 主入口MaterialApp改成GetMaterialApp
    • 4. 配置及调用
    • 5.多语言切换


运行效果

在这里插入图片描述


一、安装 GetX

dependencies:
get: ^4.6.6

二、使用

1.语言配置 在lib/core下创建一个language文件夹,文件夹下创建一个local.dart文件

class Local {
  static const String appName = 'BraveComponent';
  static const String helloWorld = '你好,世界';
  static const String followerSystemLanguage = '跟随系统语言';
  static const String simplifiedChinese = '简体中文';
  static const String traditionalChinese = '繁体中文';
  static const String english = '英文';
  static const String setting = '设置';
  static const String multiLanguage = '多语言';
  static const String theme = '主题';
}

2.language文件夹下创建一个messages.dart文件

import 'package:get/get.dart';

import 'local.dart';

class Messages extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'zh_CN': {
          Local.appName: 'BraveComponent',
          Local.helloWorld: '你好,世界',
          Local.followerSystemLanguage: '跟随系统语言',
          Local.simplifiedChinese: '简体中文',
          Local.traditionalChinese: '繁体中文',
          Local.english: '英文',
          Local.setting: '设置',
          Local.multiLanguage: '多语言',
          Local.theme: '主题',
        },
        'zh_HK': {
          Local.appName: 'BraveComponent',
          Local.helloWorld: '妳好,世界',
          Local.followerSystemLanguage: '跟隨系統語言',
          Local.simplifiedChinese: '簡體中文',
          Local.traditionalChinese: '繁體中文',
          Local.english: '英文',
          Local.setting: '設置',
          Local.multiLanguage: '多語言',
          Local.theme: '主題',
        },
        'en_US': {
          Local.appName: 'BraveComponent',
          Local.helloWorld: 'HelloWorld',
          Local.followerSystemLanguage: 'FollowerSystemLanguage',
          Local.simplifiedChinese: 'SimplifiedChinese',
          Local.traditionalChinese: 'TraditionalChinese',
          Local.english: 'English',
          Local.setting: 'Setting',
          Local.multiLanguage: 'MultiLanguage',
          Local.theme: 'Theme',
        },
      };
}

3. 主入口MaterialApp改成GetMaterialApp

main.dart类

import 'package:flutter/material.dart';

import 'app.dart';
import 'core/cache/cache/cache.dart';
import 'l10n_app.dart';

void main() async {
  await Cache.instance.init();
  // runApp(L10nApp()); //flutter_localizations与GetX配合版的多语言
  runApp(const App()); //GetX版多语言
}

app.dart类

import 'package:brave_component/core/utils/language_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';

import 'core/language/messages.dart';
import 'l10n/l10n.dart';
import 'routes/route_pages.dart';
import 'routes/route_path.dart';

class App extends StatefulWidget {
  const App({super.key});

  @override
  State<App> createState() => AppState();
}

class AppState extends State<App> {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialRoute: RoutePath.main,
      getPages: RoutePages.getPages,
      title: 'component',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      translations: Messages(),
      locale: LanguageUtils.getLocale(),
      fallbackLocale: const Locale("zh", "CN"),
      localeResolutionCallback: (deviceLocale, supportedLocales) {
        print('当前语言:${deviceLocale.toString()}');
        return;
      },
      supportedLocales: AppLocalizations.supportedLocales,
      localizationsDelegates: const [
        AppLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalMaterialLocalizations.delegate
      ],
    );
  }
}

language_utils.dart类

import 'package:brave_component/l10n/l10n.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';

import '../../l10n_app.dart';
import '../cache/helpers/cache_helper.dart';
import '../enums/language.dart';

class LanguageUtils {
  static String getLanguage(BuildContext context, String code) {
    late String language;
    switch (code) {
      case 'fs-Lan':
        language = context.l10n.followerSystemLanguage;
        break;
      case 'zh-CN':
        language = context.l10n.simplifiedChinese;
        break;
      case 'zh-HK':
        language = context.l10n.traditionalChinese;
        break;
      case 'en-US':
        language = context.l10n.english;
        break;
      default:
        language = context.l10n.followerSystemLanguage;
        break;
    }
    return language;
  }

  static Locale? getLocale() {
    Locale? locale;
    String code = CacheHelper.countryCode;
    List<String> lang = code.split('-');
    locale = (code == Language.fsLan.countryCode)
        ? Get.deviceLocale
        : Locale(lang[0], lang[1]);
    return locale;
  }

  static void updateLocale(String countryCode, {bool isL10n = false}) {
    List<String> lang = countryCode.split('-');
    Get.updateLocale((countryCode == Language.fsLan.countryCode)
        ? Get.deviceLocale!
        : Locale(lang[0], lang[1]));
    CacheHelper.saveCountryCode(countryCode);
    if (isL10n) {
      L10nAppState.setting.changeLocale!();
    }
  }
}

4. 配置及调用

translations: Messages(),//所有的多语言翻译资源
locale: Get.deviceLocale,//跟随系统设置语言 持久化以后这里改一下
fallbackLocale: Locale("zh", "CN"),//未提供当前Locale翻译时,备用的翻译
  - 使用   
  Text(Local.helloWorld.tr)  

5.多语言切换

multi_language_view.dart类

import 'package:brave_component/core/enums/language.dart';
import 'package:brave_component/core/language/local.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../../../../../core/res/colours.dart';
import '../../../../../widgets/base/texts.dart';
import 'multi_language_logic.dart';

class MultiLanguagePage extends StatelessWidget {
  MultiLanguagePage({super.key});

  final logic = Get.find<MultiLanguageLogic>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Texts.fontSize18Normal(Local.multiLanguage.tr,
            color: Colours.titleColor),
        leading: GestureDetector(
          onTap: () {
            Get.back(result: 'changeLanguage');
          },
          child: const Icon(Icons.arrow_back),
        ),
      ),
      body: Container(
        padding: const EdgeInsets.symmetric(vertical: 15),
        // child: ListView(
        //   children: ListTile.divideTiles(
        //           context: context,
        //           tiles: Language.values
        //               .map((e) =>
        //                   GetBuilder<MultiLanguageLogic>(builder: (logic) {
        //                     return ListTile(
        //                       title: Texts.fontSize14Normal(e.title,
        //                           color: Colours.titleColor),
        //                       trailing: e.countryCode == logic.countryCode
        //                           ? const Icon(Icons.check,
        //                               color: Colours.primaryColor)
        //                           : null,
        //                       onTap: () {
        //                         logic.changeLanguage(e.countryCode);
        //                       },
        //                     );
        //                   }))
        //               .toList())
        //       .toList(),
        // ),
        child: ListView.separated(
            itemBuilder: (context, index) {
              return _itemContent(context, index);
            },
            separatorBuilder: (_, index) => const Divider(),
            itemCount: Language.values.length),
      ),
    );
  }

  Widget _itemContent(BuildContext context, int index) {
    return GetBuilder<MultiLanguageLogic>(builder: (logic) {
      return Container(
        padding: const EdgeInsets.symmetric(horizontal: 15),
        height: 44,
        child: GestureDetector(
          onTap: () {
            logic.changeLanguage(Language.values[index].countryCode);
          },
          child: Row(
            children: [
              Expanded(
                  child: Texts.fontSize14Normal(Language.values[index].title,
                      color: Colours.titleColor)),
              Visibility(
                  visible:
                      logic.countryCode == Language.values[index].countryCode,
                  child: const Icon(Icons.check, color: Colours.primaryColor))
            ],
          ),
        ),
      );
    });
  }
}

multi_language_logic.dart类

import 'package:brave_component/core/cache/helpers/cache_helper.dart';
import 'package:get/get.dart';

import '../../../../../core/utils/language_utils.dart';

class MultiLanguageLogic extends GetxController {
  late String countryCode;

  @override
  void onInit() {
    super.onInit();
    countryCode = CacheHelper.countryCode;
  }

  void changeLanguage(String code) {
    countryCode = code;
    LanguageUtils.updateLocale(code);
    update();
  }
}

multi_language_binding.dart类


import 'package:get/get.dart';

import 'multi_language_logic.dart';

class MultiLanguageBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut(() => MultiLanguageLogic());
  }
}


language.dart类

enum Language {
  fsLan(title: "跟随系统语言", countryCode: "fs-Lan"),
  zhCN(title: "简体中文", countryCode: "zh-CN"),
  zhHK(title: "繁体中文", countryCode: "zh-HK"),
  enUS(title: "English", countryCode: "en-US");

  final String title;
  final String countryCode;

  const Language({required this.title, required this.countryCode});
}


这里关于GetX的binding用法不会的可以参考Flutter 多语言、主题切换之GetX库!这个博主开发的GetX插件,生成模版代码提高研发效率,建议看看用起来。

持久化就不赘述了,参考源码

源码

上一篇 多语言方案一:flutter_localizations 与 GetX 配合版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/567776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防反接、防过压、缓启动电路相关

一、防反接电路 电源正确接入时 电流从 VIN 端流向负载&#xff0c;经由 Q3(NMOS) 通向地&#xff08;GND&#xff09;。在上电瞬间&#xff0c;由于 MOS 管的体二极管效应&#xff0c;地回路通过体二极管接通。接下来&#xff0c;由于 Vgs(门源电压)大于 Vgsth(门限电压)&…

负载均衡器

服务端负载均衡器 在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如F5&#xff09;&#xff0c;也有软件的&#xff08;比如Nginx&#xff0c;openResty&#xff09; 如Nginx &#xff0c;通过Nginx进行负载均衡&#xff0c;先发送请求…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 附代码实现

AAAI-24 | EarnHFT:针对高频交易的分层强化学习&#xff08;RL&#xff09;框架 摘要(Abstract):高频交易&#xff08;HFT&#xff09;使用计算机算法在短时间内&#xff08;例如秒级&#xff09;做出交易决策&#xff0c;在加密货币市场&#xff08;例如比特币&#xff09;中…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本&#xff08;Y4tacker这个师傅的&#xff09; # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

Pytest精通指南(27)钩子函数-多重校验(pytest-assume)

文章目录 前言应用场景插件安装注意事项参数分析assert断言示例assume断言示例 前言 pytest-assume是pytest的一个扩展插件&#xff0c;它提供了一种新的断言方式&#xff0c;即**“assume”**。 与常规的assert语句不同&#xff0c;当使用assume进行断言时&#xff0c;即使某个…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时&#xff0c;可以通过bugreport把系统当前时刻点&#xff08;运行BugRepot的时刻&#xff09;的系统相关的状态和信息…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日&#xff0c;腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型&#xff0c;除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品&#xff0c;腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

fawawf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

05_FreeRTOS信号量

信号量 信号量信号量简介常用信号量API函数 信号量 信号量简介 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;可以实现任务之间同步或临界资源的互斥访问&#xff0c;常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中&#xf…

【C语言__指针02__复习篇12】

目录 前言 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 前言 本篇主要讨论以下问题&#xff1a; 1. 数组名通常表示什么&#xff0c;有哪两种例外情况&#xff0c;在例外情况中…

Electron+Vue3+ElectronForge整合 - 打包时整合 -分步打包

说明 本文介绍一下 Electron Vue3 的打包整合的基本操作。实现的效果是 &#xff1a; 1、一个正常的Vue3项目&#xff1b; 2、整合加入 Electron 框架 &#xff1a;开发时 Electron 加载的是开发的vue项目&#xff1b; 3、完成打包时整合&#xff1a;3.1 先完成vue3项目的正常…

加州理工华人用AI颠覆数学证明!提速5倍震惊陶哲轩,80%数学步骤全自动化

加州理工团队解决了形式化研究神器Lean运行LLM推理时的核心技术挑战&#xff0c;可以让LLM在Lean中提出证明策略&#xff0c;允许人类以无缝的方式干预和修改。 Lean Copilot&#xff0c;让陶哲轩等众多数学家赞不绝口的这个形式化数学工具&#xff0c;又有超强进化了&#xf…

pytest教程-29-重复执行用例插件-pytest-repeat

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了设置用例超时时间插件pytest-timeout&#xff0c;本小节我们讲解一下pytest重复执行用例插件pytest-repeat。 前言 做功能测试的时候&#xff0c;经常会遇到某个模块不稳定&#xff0c;偶然会…

五款最受欢迎的上网行为管理软件

五款最受欢迎的上网行为管理软件 员工上网看视频怎么办&#xff1f;员工偷偷刷抖音怎么办&#xff1f;员工天天上招聘网&#xff0c;是不是有离职打算&#xff1f; 解决上述困扰的最好办法是使用监控软件了解员工一言一行。以下是几款推荐的上网行为管理和监控软件&#xff1a;…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

二叉树的先序、中序和后序遍历,以及二叉树的高度

1、二叉树的三种遍历方式 前序遍历&#xff1a; 访问根节点前序遍历左子树前序遍历右子树示例&#xff1a;对于节点 A&#xff08;左子树为 B&#xff0c;右子树为 C&#xff09;&#xff0c;遍历顺序为 A -> B -> C。 中序遍历&#xff1a; 中序遍历左子树访问根节点中…

如何在Windows服务做性能测试(CPU、磁盘、内存)

目录 前言1. 基本知识2. 参数说明 前言 由于需要做一些接口测试&#xff0c;测试是否有真的优化 1. 基本知识 该基本知识主要用来用到Performance Monitor&#xff0c;以下着重介绍下这方面的知识 性能监视器&#xff08;Performance Monitor&#xff09;&#xff1a;Windo…

本地部署Docker容器可视化图形管理工具DockerUI并实现无公网IP远程访问——“cpolar内网穿透”

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

Unity的旋转实现一些方法总结(案例:通过输入,玩家进行旋转移动)

目录 1. Transform.Rotate 方法 使用 2. Transform.rotation 或 Transform.localRotation 属性与四元数 使用方式&#xff1a; 小案例 &#xff1a;目标旋转角度计算&#xff1a;targetRotation&#xff08;Quaternion类型&#xff09; 玩家发现敌人位置&#xff0c;玩家…