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

2024-04-19 14:52
文章标签 语言 方案 flutter getx

本文主要是介绍【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 {@overrideMap<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});@overrideState<App> createState() => AppState();
}class AppState extends State<App> {@overrideWidget 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>();@overrideWidget 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;@overridevoid 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 {@overridevoid 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 配合版

这篇关于【Flutter】多语言方案二:GetX 版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917854

相关文章

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初