GetXController中初始化字符串无法本地化,试RxString无效求解决方案
问题原因
testString1是在HomeController实例化时直接赋值的,此时.tr方法仅执行一次,使用的是当时的系统/当前Locale。切换语言后,这个变量不会自动重新调用.tr获取新翻译;而testString2是每次调用testMethod时才触发.tr,所以能拿到切换后的新Locale对应的翻译。
解决方法
方法1:响应式变量+Locale监听
使用RxString存储翻译文本,同时在控制器初始化时监听Locale变化,自动更新变量值,也支持手动更新:
class HomeController extends GetxController { // 初始化为'test1'的翻译 RxString testString1 = 'test1'.tr.obs; @override void onInit() { super.onInit(); // 监听Locale变化,自动更新testString1的翻译 ever(Get.locale, (Locale? newLocale) { if (newLocale != null) { testString1.value = 'test1'.tr; } }); } testMethod(){ String testString2 = 'test2'.tr; } // 手动更新testString1的方法(比如切换为其他key的翻译) updateTestString(String newTranslationKey) { testString1.value = newTranslationKey.tr; } }
UI中需要用Obx包裹组件以响应变量变化:
Obx(() => Text(controller.testString1.value))
方法2:普通变量+GetBuilder+Locale监听
如果不想用响应式变量,可以用普通String结合GetBuilder,在Locale变化或手动更新时调用update()通知UI刷新:
class HomeController extends GetxController { String testString1 = 'test1'.tr; @override void onInit() { super.onInit(); // 监听Locale变化,更新文本并通知UI ever(Get.locale, (Locale? newLocale) { if (newLocale != null) { testString1 = 'test1'.tr; update(); } }); } testMethod(){ String testString2 = 'test2'.tr; } updateTestString(String newTranslationKey) { testString1 = newTranslationKey.tr; update(); } }
UI中使用GetBuilder包裹:
GetBuilder<HomeController>( builder: (controller) => Text(controller.testString1), )
方法3:RxComputed(适用于依赖Locale的动态计算)
如果testString1的翻译仅依赖Locale或其他响应式变量,可以用RxComputed自动计算:
class HomeController extends GetxController { // 若需要切换不同翻译key,可把key设为响应式变量 final currentTranslationKey = 'test1'.obs; // 自动根据key和Locale计算翻译 final testString1 = RxComputed(() => currentTranslationKey.value.tr); testMethod(){ String testString2 = 'test2'.tr; } updateTestString(String newTranslationKey) { currentTranslationKey.value = newTranslationKey; } }
UI中同样用Obx包裹即可。
注意:之前使用
RxString无效,大概率是因为没有监听Locale变化并更新变量值,仅声明响应式变量不会自动触发重新翻译。
内容的提问来源于stack exchange,提问作者matti peter
相关产品推荐
相关产品推荐

