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
相关产品推荐
相关产品推荐

