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

Flutter GetX切换多语言翻译时无关状态变量意外变更问题

问题根因

  • 你将存储状态的number变量定义在了无状态组件MyHomePage的类属性中,切换语言时Get.updateLocale会触发GetMaterialApp下的整个组件树重建,MyHomePage会被重新实例化
  • 每次实例化MyHomePage时,final number = RxInt(count.value)逻辑都会重新执行,读取当前count的值初始化number,所以你会看到第二个计数器数值跟随切换语言的操作变化,本质和翻译功能本身无关,是组件重建导致状态重新初始化的问题

解决方法

方法1:将MyHomePage改为有状态组件,把number状态放到State类中

State类的生命周期和组件挂载周期绑定,只要组件没有被从组件树中移除,State实例就不会被重新创建,number就不会被重复初始化:

// screen2.dart 修改核心代码
class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 把number移到State类中初始化,仅在组件首次挂载时执行一次
  final number = RxInt(count.value);

  @override
  Widget build(BuildContext context) {
    // 原有build逻辑完全保留即可
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title.tr),
      ),
      // 其余原有代码不变
    );
  }
}

方法2:将number状态也放到全局控制器中统一管理

全局变量不会因为组件重建被重新初始化,也是GetX推荐的状态管理方式:

// 修改controller.dart
import 'package:get/get.dart';
var count = 0.obs;
// number也放到全局初始化,仅在应用启动时执行一次
var number = RxInt(count.value);

之后直接在MyHomePage中引用全局number变量即可,删除组件内的number初始化逻辑。

内容的提问来源于stack exchange,提问作者rushdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:06