Flutter本地化结构加载时authSignInText出现Null错误求助
Flutter本地化加载文本时的Null错误排查与解决
问题描述
在Flutter应用的本地化结构中加载文本时触发Null错误,错误发生在authSignInText的获取位置(代码中已标注)。怀疑是应用启动时_localizedValues未初始化,询问是否需要将其提前到main中初始化。
相关代码结构
语言结构
class AppLocalizationsDelegate extends LocalizationsDelegate<TextContent> { const AppLocalizationsDelegate(); @override bool isSupported(Locale locale) => TextContent.languages().contains(locale.languageCode); @override Future<TextContent> load(Locale locale) { return SynchronousFuture<TextContent>(TextContent(locale)); } @override bool shouldReload(AppLocalizationsDelegate old) => false; } class TextContent { TextContent(this.locale); final Locale locale; static TextContent of(BuildContext context) { return Localizations.of<TextContent>(context, TextContent)!; } // 从TextUtility合并语言列表 static final _localizedValues = <String, Map<String, String>>{ 'en': TextUtility.englishTexts(), }; static List<String> languages() => _localizedValues.keys.toList(); /* ********************************************************************************************** 基础设施认证文本 ************************************************************************************************/ String get authSignInText { return _localizedValues[locale.languageCode]!['signIn']!; // 此处出现NULL错误...??? } String get authFormEmailText { return _localizedValues[locale.languageCode]!['email']!; } String get authFormPasswordText { return _localizedValues[locale.languageCode]!['password']!; } ... }
映射类
abstract class TextUtility { /// /// 所有英文文本映射手动硬编码到该列表中。 static List<Map<String, String>> englishTextLists = [ InfrastructureAuthenticationText.authenticationText, InfrastructureFormValidationErrorText.invalidEmailText, InfrastructureDialogMessagesText.dialogMessagesText, ]; /// /// 英文文本合并方法 /// 将上述英文文件中的所有文本合并为一个映射,在TextContent中调用。 /// 返回: [Map<String, String>] static Map<String, String> englishTexts() { Map<String, String> allEnglishTexts = {}; for (int i = 0; i < englishTextLists.length; i++) { allEnglishTexts.addAll(englishTextLists[i]); } return allEnglishTexts; } }
语言文本
abstract class InfrastructureAuthenticationText { static const Map<String, String> authenticationText = { // 账户操作 'sign_in': 'Sign In', 'sign_out': 'Sign Out', 'sign_up': 'Sign Up', 'sign_up punctuated': 'Sign Up.', ... }; }
文本调用位置
Text( TextContent.of(context).authSignInText, style: ThemeEndpoints.primaryHeader(), ),
问题分析与解决
直接错误根源
你遇到的Null错误和_localizedValues初始化时机无关,核心原因是键名不匹配:
- 在
authSignInText中你使用的键是'signIn'(驼峰写法) - 但在
InfrastructureAuthenticationText中对应的键是'sign_in'(下划线写法)
修正步骤
修正键名匹配问题
修改authSignInText的键名:String get authSignInText { return _localizedValues[locale.languageCode]!['sign_in']!; }添加空值安全优化
为避免后续因键缺失或语言映射问题触发崩溃,建议去掉强制解包!,添加默认值:String get authSignInText { return _localizedValues[locale.languageCode]?['sign_in'] ?? 'Sign In'; }关于初始化时机的说明
当前_localizedValues是静态变量,在TextContent类第一次被访问时就会自动初始化,完全不需要提前到main中初始化。你使用SynchronousFuture同步加载本地化内容的方式,也符合当前场景的需求。
内容的提问来源于stack exchange,提问作者RobbB
相关产品推荐
相关产品推荐

