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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:15:20