Flutter如何不使用context通过AppLocalization翻译List内的文本
Flutter 自定义类List属性无Context本地化方案
方案1:存储本地化key+全局本地化实例(完全无Context依赖)
这是适配性最高的实现,支持动态切换语言、跟随系统语言等场景,步骤如下:
步骤1:完善ARB配置
先补全多语言对应的key,以英文配置为例:
{ "appTitle": "whatsup", "chatScreen": "Chat Screen", "mainScreen": "Main Screen" }
对应中文ARB配置也要添加相同key的中文翻译。
步骤2:修改自定义类存储Key而非硬编码文案
class WhatsappFeature { final String img; final String tooltip; // 存储ARB对应的多语言key,不直接存显示文案 final String labelKey; WhatsappFeature({ required this.img, required this.tooltip, required this.labelKey }); } List<WhatsappFeature> whatsappFeatures = [ WhatsappFeature( img: "assets/images/whatsapp_features/split.png", tooltip: "aadbdabdabdab", labelKey: "chatScreen" ), WhatsappFeature( img: "assets/images/whatsapp_features/status.png", tooltip: "adgrwhrtwehethth", labelKey: "mainScreen" ), ];
步骤3:全局缓存AppLocalizations实例(无Context核心)
用依赖注入工具全局存储初始化完成的多语言实例,无需每次传Context获取,这里以轻量依赖注入工具get_it为例:
- 先初始化单例容器
final getIt = GetIt.instance;
- 在
MaterialApp的语言回调中完成实例注入/更新
MaterialApp( localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], localeResolutionCallback: (locale, supportedLocales) { // 加载对应locale的本地化实例,切换语言时自动更新 AppLocalizations.delegate.load(locale!).then((value) { if(getIt.isRegistered<AppLocalizations>()){ getIt.unregister<AppLocalizations>(); } getIt.registerSingleton<AppLocalizations>(value); }); return locale; }, // 其余配置保持不变 )
步骤4:直接调用全局实例获取翻译
组件中无需传入Context就可以直接取翻译:
@override Widget build(BuildContext context) { // 完全不需要Context依赖 return Text(getIt<AppLocalizations>().lookup(whatsappFeatures[index!].labelKey)); }
如果AppLocalizations生成的是属性调用而非lookup方法,写个简单的key-属性映射方法匹配即可。
方案2:静态多语言映射表(无第三方依赖)
如果你的多语言场景简单不需要动态切换,也可以直接写静态多语言映射表,零依赖实现:
// 全局静态多语言配置 Map<String, Map<String, String>> localizedLabels = { 'en': { 'chatScreen': 'Chat Screen', 'mainScreen': 'Main Screen' }, 'zh': { 'chatScreen': '聊天页面', 'mainScreen': '首页' } }; // 全局存储当前语言标识,切换语言时修改该值即可 String currentLocale = 'zh'; // 全局翻译方法 String tr(String key) { return localizedLabels[currentLocale]?[key] ?? key; }
调用时直接用tr(whatsappFeatures[index!].labelKey)即可,完全无Context依赖。
内容的提问来源于stack exchange,提问作者Vinasirajan Vilakshan
相关产品推荐
相关产品推荐

