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

更新语言后Flutter localization不重载:Provider的locale已更新但应用实际locale未切换

问题原因及解决方法

你当前使用的是GetMaterialApp(GetX框架的应用根组件),仅更新Provider内的locale状态未同步到GetX的内部状态,是导致界面不刷新的核心原因,可按以下步骤排查修复:

1. 同步更新GetX的locale状态

修改LocaleProvider类的setLocale方法,切换语言时同步通知GetX更新全局locale:

void setLocale(Locale locale) {
  if (!L10n.all.contains(locale)) return;
  
  _locale = locale;
  print(_locale.toString());
  // 新增这行,同步GetX的locale配置
  Get.updateLocale(locale);
  notifyListeners();
}

2. 确认Provider注册位置正确

必须将LocaleProvider的提供者注册在GetMaterialApp的父级,确保根组件能监听到locale变化,示例main函数写法参考:

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => LocaleProvider(),
      child: const MyApp(),
    ),
  );
}

3. 补充locale强制回调

在GetMaterialApp配置中新增localeResolutionCallback,避免系统locale优先级覆盖自定义配置:

GetMaterialApp(
  debugShowCheckedModeBanner: false,
  theme: ThemeData.light().copyWith(
    scaffoldBackgroundColor: const Color(0xffFCFCFC),
  ),
  locale: Provider.of<LocaleProvider>(context,listen: true).locale,
  // 新增以下回调,强制返回自定义的locale
  localeResolutionCallback: (systemLocale, supportedLocales) {
    return Provider.of<LocaleProvider>(context, listen: true).locale;
  },
  supportedLocales: L10n.all,
  localizationsDelegates: const [
    AppLocalizations.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  home: const HomeMapPage(),
);

4. 检查基础配置

  • 确认L10n.all列表中已包含const Locale('my'),没有拼写错误
  • 确认缅甸语对应的arb文件中已添加language对应的翻译键值
  • 不要混用两套翻译逻辑:如果用AppLocalizations.of(context)就全局统一使用,不要部分地方用GetX的tr方法

内容的提问来源于stack exchange,提问作者Wai Yan Min Min

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:08