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

Flutter中onGenerateRoute触发_TypeError(空值检查运算符用于空值)求助

Flutter空指针错误排查:Null check operator used on a null value

问题详情

运行自定义main.dart代码时,触发_TypeError (Null check operator used on a null value)错误,调试发现错误出现在Flutter框架的app.dart文件中widget.home!所在的路由处理逻辑里。

相关代码

自定义main.dart代码

@override
Widget build(BuildContext context) {
  bool isUserLoggedin = false;
  return FutureBuilder(
      future: _checkLoginStatus(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          isUserLoggedin = snapshot.data as bool;

          return MaterialApp(
            supportedLocales: L10n.all,
            locale: _locale,
            localizationsDelegates: const [
              AppLocalizations.delegate,
              GlobalMaterialLocalizations.delegate,
              GlobalCupertinoLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
            ],
            initialRoute: isUserLoggedin ? '/home' : '/login',
            routes: {
              '/home': (context) => HomePage(),
              '/login': (context) => Login(),
            },
          );
        } else {
          return MaterialApp(
            home: Scaffold(
              body: Center(child: Text('loading')),
            ),
          );
        }
      });
}

框架app.dart报错代码片段

PlatformRouteInformationProvider? _defaultRouteInformationProvider;
BackButtonDispatcher get _effectiveBackButtonDispatcher =>
    widget.backButtonDispatcher ?? _defaultBackButtonDispatcher!;
RootBackButtonDispatcher? _defaultBackButtonDispatcher;

// NAVIGATOR

GlobalKey<NavigatorState>? _navigator;

Route<dynamic>? _onGenerateRoute(RouteSettings settings) {
  final String? name = settings.name;
  final WidgetBuilder? pageContentBuilder =
      name == Navigator.defaultRouteName && widget.home != null
          ? (BuildContext context) => widget.home! // 错误触发位置
          : widget.routes![name];

  if (pageContentBuilder != null) {
    assert(
      widget.pageRouteBuilder != null,
      'The default onGenerateRoute handler for WidgetsApp must have a '
      'pageRouteBuilder set if the home or routes properties are set.',
    );
    final Route<dynamic> route = widget.pageRouteBuilder!<dynamic>(
      settings,
      pageContentBuilder,
    );
    return route;

错误原因

当FutureBuilder处于加载状态时,返回的MaterialApp仅设置了home属性,但未配置routes参数。Flutter框架的WidgetsApp(MaterialApp的父类)在处理路由时,会先判断当前路由是否为默认路由(/),如果是且home不为null,就使用home对应的页面;否则会尝试从widget.routes中查找路由。此时widget.routes为null,代码中用!强制解包空值,直接触发空指针错误。

解决方案

方案一:给加载状态的MaterialApp添加空路由表

在加载状态的MaterialApp中补充routes: {},避免widget.routes为null:

} else {
  return MaterialApp(
    home: Scaffold(
      body: Center(child: Text('loading')),
    ),
    routes: {}, // 添加空路由表
  );
}

方案二:加载状态直接返回Scaffold,无需创建MaterialApp

去掉加载状态的MaterialApp,直接返回加载UI:

} else {
  return Scaffold(
    body: Center(child: Text('loading')),
  );
}

方案三:统一路由配置(进阶)

将加载状态的UI整合到同一个MaterialApp的路由逻辑中,比如通过onGenerateRoute处理加载状态,但前两种方案更简洁直接。

内容的提问来源于stack exchange,提问作者MmM squie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:57