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

Flutter中如何实现国际化(Intl)与枚举(Enum)的关联?

Flutter枚举与Intl国际化交互问题解决

问题原因

你写的枚举使用了const构造器,要求传入的参数必须是编译时常量,但S.current.title是运行时才能确定的本地化字符串:

  • 枚举类加载时,S.current还未完成初始化,会返回null,导致无法赋值给String类型的参数
  • S.current.title不属于编译常量,不符合const构造器的参数要求

解决方案

不要在枚举中直接存储本地化字符串,改为存储枚举对应的本地化标识,再通过BuildContext动态获取本地化文本。

修改后的枚举代码

import '../generated/l10n.dart';
import 'package:flutter/material.dart';

enum AminoacidosEnum {
  titulo,
  helloWorld;

  // 根据上下文获取对应本地化文本
  String getLocalizedText(BuildContext context) {
    switch (this) {
      case AminoacidosEnum.titulo:
        return S.of(context).title;
      case AminoacidosEnum.helloWorld:
        return S.of(context).helloWorld;
    }
  }
}

在页面中使用

import 'package:flutter/material.dart';
import 'package:internacionalizacao/enums/aminoacidos_enum.dart';
import '../generated/l10n.dart';

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          children: [
            // 调用枚举的方法获取本地化文本
            Text(AminoacidosEnum.titulo.getLocalizedText(context)),
            Text(S.of(context).helloWorld),
            Text(S.of(context).concatenedText('Thiago C. Pedroso')),
            Text(S.of(context).textWithPlaceHolders("Pedroso", 'Thiago Cristian')),
            Text(S.of(context).pageNotificationsCount(0)),
            Text(S.of(context).pageNotificationsCount(1)),
            Text(S.of(context).pageNotificationsCount(2)),
            Text(S.of(context).gender("male")),
            Text(S.of(context).pageHomeBalance(1234567890, DateTime.now())),
          ],
        ),
      ),
    );
  }
}

补充说明

  • 避免在枚举初始化阶段直接调用S.current,该对象需要在MaterialApp配置了本地化代理后才能正常初始化
  • 如果枚举项较多,可以考虑使用扩展方法或者映射表来替代switch,不过switch方式类型更安全,不容易出错

内容的提问来源于stack exchange,提问作者Pedroso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:15:55