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
相关产品推荐
相关产品推荐

