Flutter使用flutter_translate遇方法调用非常量及switch case报错如何解决?
问题根源
translate() 是运行时执行的方法,需要依赖初始化后的国际化配置才能拿到对应语言的文本,不属于编译时常量,所以两个报错本质是冲突的需求:你既需要运行时动态生成翻译文本,又需要把这个值当编译时常量用在switch case里。
方案1:枚举+翻译映射(推荐)
核心逻辑是用固定的枚举值作为switch case的常量,单独维护枚举和翻译文本的映射关系,代码示例:
import 'package:flutter_translate/flutter_translate.dart'; // 先定义枚举作为固定常量 enum TabMenuAction { newTab, // 新增其他操作直接加枚举项 } class TabViewerPopupMenuActions { // 维护枚举和翻译文本的映射 static String getActionText(TabMenuAction action) { switch(action) { case TabMenuAction.newTab: return translate('options.new_tab'); // 其他枚举值对应对应翻译key即可 } } // 动态生成choices列表 static List<String> get choices => TabMenuAction.values.map(getActionText).toList(); }
原来的switch逻辑调整为用枚举判断即可:
// 先把拿到的choice文本匹配为对应枚举 TabMenuAction? selectedAction; for (var action in TabMenuAction.values) { if (TabViewerPopupMenuActions.getActionText(action) == choice) { selectedAction = action; break; } } // switch的case都是常量枚举,不会报错 switch (selectedAction) { case TabMenuAction.newTab: // 执行新建标签逻辑 break; default: break; }
方案2:替换switch为if-else判断
if-else的判断条件不需要是编译时常量,不需要改动现有常量结构,直接修改原来的switch代码即可,适合小项目快速修复:
if (choice == TabViewerPopupMenuActions.NEW_TAB) { // 新建标签逻辑 } // else if 对应其他选项判断 else { // 默认逻辑 }
内容的提问来源于stack exchange,提问作者LihnNguyen
相关产品推荐
相关产品推荐

