Flutter如何隐藏GetX国际化类 解决与easy_localization的tr()冲突
报错原因
internacionalization是GetX内部的源码文件名,并非package:get/get.dart对外导出的公开成员,你hide的目标不存在,自然触发报错。
两个包的冲突根源是GetX与easy_localization都为String类型提供了同名的tr相关方法,编译器无法识别具体调用的实现,可根据自身场景选择以下两种方案解决:
方案1:隐藏GetX的国际化扩展(代码改动最小)
GetX中实现tr/trArgs/trPlural等国际化方法的扩展类是公开导出的Trans,直接隐藏这个扩展即可,其余GetX的API不需要做任何改动:
// 隐藏GetX自带的国际化扩展 import 'package:get/get.dart' hide Trans; // 正常导入easy_localization,后续代码中tr默认指向easy_localization的实现 import 'package:easy_localization/easy_localization.dart';
该方案适合完全使用easy_localization做国际化、不需要调用GetX自带国际化能力的项目。
方案2:给导入的包加命名空间前缀(彻底无冲突)
如果后续需要混用两个包的国际化能力,推荐给其中一个包加导入前缀,从根源上隔离命名空间:
比如给GetX的导入加前缀,保留easy_localization的tr全局可直接调用:
// 给GetX设置导入前缀getx import 'package:get/get.dart' as getx; import 'package:easy_localization/easy_localization.dart';
后续所有GetX的API调用都需要加上getx.前缀即可,示例:
// 页面跳转 getx.Get.toNamed('/detail'); // 响应式组件 getx.Obx(() => Text('home_title'.tr())) // 响应式变量声明 final pageIndex = getx.RxInt(0);
如果需要调用GetX的tr方法,也可以通过前缀明确指定,不会和easy_localization的实现冲突。
内容的提问来源于stack exchange,提问作者Cyrus the Great
相关产品推荐
相关产品推荐

