You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例:

  1. 先初始化单例容器
final getIt = GetIt.instance;
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:54:01