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
相关产品推荐
相关产品推荐

