Flutter切换多语言时不同Locale对应不同字体不生效如何解决
修复方案
核心问题
你用了Flutter原生的Localizations.localeOf(context)读取当前语言,但GetX的Get.updateLocale是独立管控多语言状态的,原生的Localizations没有和GetX的状态同步,切换阿拉伯语的时候拿到的还是旧的英文编码,自然不会加载Cairo字体。
具体改法
- 把读取语言的方式换成GetX自带的API,直接用
Get.locale读取,不需要依赖context。如果用GetX的话建议直接把根组件换成GetMaterialApp,适配性更好,改完的代码如下:
return GetMaterialApp( home: HomeScreen(), builder: (context, navigator) { // 直接用Get.locale读,不要用Localizations final lang = Get.locale?.languageCode ?? 'en'; return Theme( data: ThemeData( fontFamily: lang == 'ar' ? 'Cairo Regular' : 'Poppins Regular' ), child: navigator!, ); }, );
- 检查
pubspec.yaml里的字体配置,确保家族名和你代码里写的完全一致,大小写、空格都不能有差异,配置示例:
flutter: fonts: - family: Cairo Regular fonts: - asset: assets/fonts/Cairo-Regular.ttf - family: Poppins Regular fonts: - asset: assets/fonts/Poppins-Regular.ttf
- 切换语言的时候加一行强制更新,避免缓存的旧主题不刷新:
updateLocal(Locale locale, BuildContext context) { Navigator.of(context).pop(); Get.updateLocale(locale); Get.forceAppUpdate(); // 加这行强制整个应用重绘 }
排查方法
要是改完还是不行,你在builder里打个日志,看看切换阿拉伯语的时候打印出来的lang是不是'ar':
final lang = Get.locale?.languageCode ?? 'en'; debugPrint('当前语言编码:$lang');
如果打印出来是'ar'但字体还是不对,那就是字体配置的问题,检查下字体文件路径、文件名有没有写错即可。
内容的提问来源于stack exchange,提问作者Fsd Ramjan
相关产品推荐
相关产品推荐

