Flutter多语言应用调用本地化字符串时遇Unexpected Null Value错误
解决Flutter多语言应用中的Unexpected Null Value错误
错误日志
Restarted application in 87ms. ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ The following TypeErrorImpl was thrown building Main(dirty): Unexpected null value. The relevant error-causing widget was: Main When the exception was thrown, this was the stack: dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 288:49 throw_ dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 606:63 nullCheck packages/flutter_gen/gen_l10n/app_localizations.dart 69:73 of packages/fids/main.dart 44:67 build packages/flutter/src/widgets/framework.dart 5156:22 build packages/flutter/src/widgets/framework.dart 5086:15 performRebuild packages/flutter/src/widgets/framework.dart 4805:7 rebuild packages/flutter/src/widgets/framework.dart 5068:5 [_firstBuild] packages/flutter/src/widgets/framework.dart 5062:5 mount packages/flutter/src/widgets/framework.dart 3971:15 inflateWidget packages/flutter/src/widgets/framework.dart 3708:18 updateChild packages/flutter/src/widgets/framework.dart 5111:16 performRebuild packages/flutter/src/widgets/framework.dart 4805:7 rebuild packages/flutter/src/widgets/framework.dart 5068:5 [_firstBuild] packages/flutter/src/widgets/framework.dart 5062:5 mount packages/flutter/src/widgets/framework.dart 3971:15 inflateWidget packages/flutter/src/widgets/framework.dart 3708:18 updateChild packages/flutter/src/widgets/framework.dart 5111:16 performRebuild packages/flutter/src/widgets/framework.dart 5251:11 performRebuild packages/flutter/src/widgets/framework.dart 4805:7 rebuild packages/flutter/src/widgets/framework.dart 5068:5 [_firstBuild] packages/flutter/src/widgets/framework.dart 5242:11 [_firstBuild] packages/flutter/src/widgets/framework.dart 5062:5 mount packages/flutter/src/widgets/framework.dart 3971:15 inflateWidget packages/flutter/src/widgets/framework.dart 3708:18 updateChild packages/flutter/src/widgets/framework.dart 5111:16 performRebuild packages/flutter/src/widgets/framework.dart 4805:7 rebuild packages/flutter/src/widgets/framework.dart 5068:5 [_firstBuild] packages/flutter/src/widgets/framework.dart 5062:5 mount packages/flutter/src/widgets/framework.dart 3971:15 inflateWidget packages/flutter/src/widgets/framework.dart 3708:18 updateChild packages/flutter/src/widgets/framework.dart 5111:16 performRebuild packages/flutter/src/widgets/framework.dart 4805:7 rebuild packages/flutter/src/widgets/framework.dart 5068:5 [_firstBuild] packages/flutter/src/widgets/framework.dart 5062:5 mount packages/flutter/src/widgets/framework.dart 3971:15 inflateWidget packages/flutter/src/widgets/framework.dart 3708:18 updateChild packages/flutter/src/widgets/binding.dart 1240:16 [_rebuild] packages/flutter/src/widgets/binding.dart 1209:5 mount packages/flutter/src/widgets/binding.dart 1156:16 <fn> packages/flutter/src/widgets/framework.dart 2720:19 buildScope packages/flutter/src/widgets/binding.dart 1155:12 attachToRenderTree packages/flutter/src/widgets/binding.dart 987:24 attachRootWidget packages/flutter/src/widgets/binding.dart 968:7 <fn> dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19 internalCallback ════════════════════════════════════════════════════════════════════════════════════════════════════
问题根因
在Main widget的build方法中,直接通过当前context调用AppLocalizations.of(context)获取本地化字符串并传给MaterialApp的home参数。此时MaterialApp尚未完成初始化,当前context不属于MaterialApp的子树,无法获取已配置的本地化资源,导致AppLocalizations.of(context)返回null,调用pageTitle时触发空值错误。
解决方案
提供两种可行修改方式:
方式一:用Builder包裹Home widget
通过Builder生成属于MaterialApp子树的context,以此正确获取本地化资源:
// 修改main.dart中的MaterialApp部分 home: Builder( builder: (context) { return CustomAppBar(appBarText: AppLocalizations.of(context).pageTitle); }, ),
方式二:在CustomAppBar内部获取本地化字符串
修改CustomAppBar,移除appBarText参数,在自身build方法中获取本地化字符串(此时context属于MaterialApp子树):
// 修改后的app_bar.dart import '../src.dart'; class CustomAppBar extends StatelessWidget { final Color appBarTextColor; final Color appBarColor; final Color appBarShadowColor; const CustomAppBar({ super.key, this.appBarColor = AppColors.primary, this.appBarTextColor = AppColors.onPrimary, this.appBarShadowColor = AppColors.onBackground, }); @override Widget build(BuildContext context) { final appBarText = AppLocalizations.of(context).pageTitle; return Scaffold( appBar: AppBar( toolbarHeight: 80, title: Text( appBarText, style: TextStyle(color: appBarTextColor, fontSize: 40), ), backgroundColor: appBarColor, shadowColor: appBarShadowColor, elevation: 10, leadingWidth: 150, leading: Padding( padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), child: Image( image: AssetImage(AppImages.iacImage), fit: BoxFit.contain, ), ), ), body: Container(), ); } }
对应的main.dart中home参数修改为:
home: const CustomAppBar(),
补充说明
flutter clean和flutter pub get无法解决此问题,因为这不是依赖或缓存问题,而是context作用域的逻辑错误。- 之前使用的BuildContext扩展仅简化调用方式,不影响问题本质,因此移除后仍会报错。
内容的提问来源于stack exchange,提问作者Masoud Ghasemi
相关产品推荐
相关产品推荐

