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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:55:01