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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:07:45