更新语言后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
相关产品推荐
相关产品推荐

