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

Flutter调用context.setLocale()切换Locale后,如何重新加载当前Widget?

解决Flutter切换Locale后当前Widget不刷新的问题

看起来你遇到的问题是切换语言后,当前页面的本地化选项(比如_floorList)没有同步更新,但其他非活跃页面却能正常显示新语言。这是因为当前Widget的状态没有监听Locale的变化,切换语言后虽然你手动调用了_getOptions(),但Locale的更新可能还未完全生效,或者当前Widget没有触发重建来刷新这些本地化内容。

下面给你两种可行的解决方案:

方案一:通过WidgetsBindingObserver监听Locale变化

我们可以让页面的State类混入WidgetsBindingObserver,这样就能监听App的Locale变化,一旦变化就自动重新加载本地化选项:

  1. 先给你的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方法...
}
  1. 然后可以移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:07:39