Flutter调用context.setLocale()切换Locale后,如何重新加载当前Widget?
解决Flutter切换Locale后当前Widget不刷新的问题
看起来你遇到的问题是切换语言后,当前页面的本地化选项(比如_floorList)没有同步更新,但其他非活跃页面却能正常显示新语言。这是因为当前Widget的状态没有监听Locale的变化,切换语言后虽然你手动调用了_getOptions(),但Locale的更新可能还未完全生效,或者当前Widget没有触发重建来刷新这些本地化内容。
下面给你两种可行的解决方案:
方案一:通过WidgetsBindingObserver监听Locale变化
我们可以让页面的State类混入WidgetsBindingObserver,这样就能监听App的Locale变化,一旦变化就自动重新加载本地化选项:
- 先给你的State类添加混入并注册监听:
class YourSettingsPageState extends State<YourSettingsPage> with WidgetsBindingObserver { // 你的现有变量:_floorList、_planTypeList、_floor、_planType、_preferences... @override void initState() { super.initState(); // 注册Locale变化监听 WidgetsBinding.instance.addObserver(this); _getOptions(); } @override void dispose() { // 移除监听,避免内存泄漏 WidgetsBinding.instance.removeObserver(this); super.dispose(); } // 监听Locale变化的回调方法 @override void didChangeLocales(List<Locale>? locales) { super.didChangeLocales(locales); // 当Locale更新时,重新加载本地化选项 _getOptions(); } // 你的现有_getOptions方法(注意修正拼写错误) void _getOptions() { setState(() { _floorList = Floor.values .map((value) => tr('plan.floor.' + value.toString().split('.')[1])) .toList(); _planTypeList = PlanType.values .map((value) => tr('plan.type.' + value.toString().split('.')[1])) .toList(); // 修正拼写错误:mapDefaultFLoor → mapDefaultFloor _floor = tr('plan.floor.' + (_preferences.getString('mapDefaultFloor') ?? 'ground')); _planType = tr('plan.type.' + (_preferences.getString('mapDefaultType') ?? 'newNumbers')); }); } // 你的build方法... }
- 然后可以移除
onChanged里的手动调用,因为监听会自动触发:
onChanged: (String newLocale) { context.setLocale(newLocale.toLocale(separator: ' ')); // 移除这里的_getOptions(); },
方案二:让Build方法依赖Locale
另一种思路是让页面的Build方法明确依赖当前Locale,这样Flutter会自动感知Locale变化并触发重建。你只需要在Build中获取当前Locale,确保它成为Build方法的依赖项:
@override Widget build(BuildContext context) { // 获取当前Locale,让Build方法依赖它 final currentLocale = context.locale; return Scaffold( body: Form( child: CardSettings( // 你的现有代码... ), ), ); }
这种方式下,只要Locale变化,Build方法就会重新执行,结合_getOptions()的逻辑,就能同步更新本地化内容。
另外提醒你:代码里有个拼写错误mapDefaultFLoor,应该改为mapDefaultFloor,不然会读取不到保存的默认楼层设置,记得修正。
这样修改后,切换语言时当前Widget的本地化内容就能正常更新了。
内容的提问来源于stack exchange,提问作者Tomkys
相关产品推荐
相关产品推荐

