Flutter页面返回异常问题:Navigator.pop黑屏、Navigator.push触发空值检查运算符错误
解决Flutter Calendar页面返回问题与Null Check错误
咱们来一步步拆解你遇到的两个问题,然后给出针对性的修复方案:
问题根源分析
1. Navigator.pop(context)导致黑屏
你的Calendar组件里嵌套了一个独立的MaterialApp,这会创建一个全新的导航栈。当你调用Navigator.pop(context)时,这个新栈里只有当前页面,pop之后栈为空,自然就出现了黑屏。
2. "Null check operator on a null value"错误
错误栈指向ShowSessionsPage的AppLocalizations.of(context)!代码行,这是因为Calendar里的MaterialApp没有配置本地化代理和支持的语言环境,导致AppLocalizations.of(context)返回null,用!强制解包就触发了空值错误。
修复方案
核心思路是移除Calendar组件中的MaterialApp,让它复用父页面(ShowSessionsPage所在的)导航上下文和本地化配置,这样两个问题都能解决:
修改后的Calendar完整代码:
import 'ShowSessionsPage.dart'; import 'event.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; import '../../Panels/SessionOrBookingPanel.dart'; import '../../Controllers/AppController.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Calendar extends StatelessWidget { final AppController appController; // 用初始化列表优化构造函数,更符合Flutter空安全规范 const Calendar(this.appController, {super.key}); @override Widget build(BuildContext context) { // 直接返回Scaffold,不再嵌套独立的MaterialApp return Scaffold( appBar: AppBar( leading: IconButton( color: appController.themeController.appBlackDeepColor, tooltip: 'Back', alignment: Alignment.centerLeft, icon: (appController.deviceIsAndroid) ? const Icon(Icons.arrow_back) : const Icon(Icons.arrow_back_ios), onPressed: () { // 现在pop可以正确返回上一页了 Navigator.pop(context); }, ), ), body: SfDateRangePicker( view: DateRangePickerView.month, monthViewSettings: DateRangePickerMonthViewSettings( firstDayOfWeek: 6, specialDates: appController.specialDates ), monthCellStyle: DateRangePickerMonthCellStyle( specialDatesDecoration: BoxDecoration( color: Colors.green, border: Border.all(color: const Color(0xFF2B732F), width: 1), shape: BoxShape.circle), blackoutDateTextStyle: TextStyle(color: Colors.white, decoration: TextDecoration.lineThrough), specialDatesTextStyle: const TextStyle(color: Colors.white), ), selectionMode: DateRangePickerSelectionMode.multiple, onSelectionChanged: _onSelectionChanged, controller: DateRangePickerController(), onCancel: (picker) { picker.controller.selectedRanges = null; }, ), ); } void _onSelectionChanged( DateRangePickerSelectionChangedArgs dateRangePickerSelectionChangedArgs) { print(dateRangePickerSelectionChangedArgs.value); } }
额外优化建议
顺便给ShowSessionsPage的构造函数也做个优化,避免潜在的空安全问题:
class ShowSessionsPage extends StatefulWidget { final AppController appController; const ShowSessionsPage(this.appController, {super.key}); @override _ShowSessionsPageState createState() => _ShowSessionsPageState(); }
修改完成后,两个问题都会得到解决:
Navigator.pop(context)可以正常回到ShowSessionsPage,不再出现黑屏- 本地化的空值错误也会消失,因为现在复用了父页面的
MaterialApp配置
内容的提问来源于stack exchange,提问作者Bill Tertis
相关产品推荐
相关产品推荐

