【问题标题】:Flutter issue : type 'Null' is not a subtype of 'DateTime'颤振问题:类型“Null”不是“DateTime”的子类型
【发布时间】:2021-11-20 12:25:13
【问题描述】:

我正在就个人项目寻求帮助。基本上,我有日历作为应用程序抽屉选项,当我仍在日历页面和热重新加载时它正在工作,但现在热重启后它一直向我显示此错误

type 'Null' is not a subtype of type 'DateTime'

这是我的日历屏幕代码:

import 'package:attendance_checker/screens/home.dart';

import 'package:flutter/material.dart';
import 'package:table_calendar/table_calendar.dart';
import 'package:attendance_checker/models/calendar_events.dart';

class Calender extends StatefulWidget {
  const Calender({Key? key}) : super(key: key);

  @override
  _CalenderState createState() => _CalenderState();
}

class _CalenderState extends State<Calender> {
  late Map<DateTime, List<Event>> selectedEvents;
  CalendarFormat format = CalendarFormat.month;
  var focusedDay;
  var selectedDay;

  TextEditingController _eventController = TextEditingController();

  @override
  void initState() {
    selectedEvents = {};
    super.initState();
  }

  @override
  void dispose() {
    _eventController.dispose();
    super.dispose();
  }

  List<Event> _getEventsfromDay(DateTime date) {
    return selectedEvents[date] ?? [];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: BackButton(
            color: Colors.white,
            onPressed: () => Navigator.pushReplacement(
                context, MaterialPageRoute(builder: (context) => Home()))),
        title: Text("Calendar"),
        backgroundColor: Colors.green[700],
      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            Column(
              children: [
                TableCalendar(
                  focusedDay: DateTime.now(),
                  firstDay: DateTime.utc(2010, 10, 16),
                  lastDay: DateTime.utc(2030, 3, 14),
                  calendarFormat: format,
                  onFormatChanged: (CalendarFormat _format) {
                    setState(() {
                      format = _format;
                    });
                  },
                  eventLoader: _getEventsfromDay,
                  calendarStyle: CalendarStyle(
                      isTodayHighlighted: true,
                      selectedDecoration: BoxDecoration(
                        color: Colors.green[300],
                        shape: BoxShape.circle,
                      ),
                      selectedTextStyle: TextStyle(color: Colors.white),
                      todayDecoration: BoxDecoration(
                        color: Colors.green[700],
                        shape: BoxShape.circle,
                      )),
                  startingDayOfWeek: StartingDayOfWeek.sunday,
                  daysOfWeekVisible: true,
                  onDaySelected: (DateTime selectDay, DateTime focusDay) {
                    setState(() {
                      selectedDay = selectDay;
                      focusedDay = focusDay;
                    });
                    print(focusedDay);
                  },
                  selectedDayPredicate: (DateTime date) {
                    return isSameDay(selectedDay, date);
                  },
                  headerStyle: HeaderStyle(
                      formatButtonVisible: false, titleCentered: true),
                ),
                ..._getEventsfromDay(selectedDay).map((Event event) => ListTile(
                      title: Text(event.title),
                    )),
              ],
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () => showDialog(
          context: context,
          builder: (context) => AlertDialog(
            title: Text("Add Event"),
            content: TextFormField(
              controller: _eventController,
            ),
            actions: [
              TextButton(
                  onPressed: () => Navigator.pop(context),
                  child: Text("Cancel")),
              TextButton(
                  onPressed: () {
                    if (_eventController.text.isEmpty) {
                    } else {
                      if (selectedEvents[selectedDay] != null) {
                        selectedEvents[selectedDay]!
                            .add(Event(title: _eventController.text));
                      } else {
                        selectedEvents[selectedDay] = [
                          Event(title: _eventController.text)
                        ];
                      }
                    }
                    Navigator.pop(context);
                    _eventController.clear();
                    setState(() {});
                    return;
                  },
                  child: Text("OK"))
            ],
          ),
        ),
        label: Text("Add label"),
        icon: Icon(Icons.add),
        backgroundColor: Colors.green[600],
      ),
    );
  }
}

这里是我调用日历屏幕的地方:

import 'package:attendance_checker/screens/calender.dart';
import 'package:attendance_checker/screens/help.dart';
import 'package:attendance_checker/widgets/checkboxlist.dart';
import 'package:attendance_checker/widgets/classinfo.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  //const Home({ key }) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Attendance Checker"),
          backgroundColor: Colors.green[700],
        ),
        drawer: Drawer(
          child: ListView(
            children: [
              DrawerHeader(
                child: Text(
                  "Drawer header",
                  style: TextStyle(fontSize: 24, color: Colors.white),
                ),
                decoration: BoxDecoration(color: Colors.green[700]),
              ),
              ListTile(
                title: Text("Calender"),
                trailing: Icon(Icons.calendar_today_rounded),
                onTap: () {
                  Navigator.pushReplacement(context,
                      MaterialPageRoute(builder: (context) => Calender()));
                },
              ),
              ListTile(
                title: Text("Help"),
                trailing: Icon(Icons.question_answer),
                onTap: () {
                  Navigator.pushReplacement(
                      context, MaterialPageRoute(builder: (context) => Help()));
                },
              )
            ],
          ),
        ),
        backgroundColor: Colors.green[400],
        body: Column(
          children: <Widget>[ClassInfo(), Checklist()],
        ));
  }
}

我不确定为什么会发生此错误,但如果您能帮助我解决这个问题,那将是非常有帮助的。提前致谢

【问题讨论】:

  • 你能突出显示错误发生在哪一行吗?很难像这样排除故障。
  • 尝试将 selectedDayfocusedDay 的声明从 var 更改为 DateTime 并查看是否出现任何构建错误。
  • @TimJacobs ..._getEventsfromDay(selectedDay).map((Event event) => ListTile(title: Text(event.title), )), 这是错误追踪到的行这是第 90 行
  • @h8moss 将其更改为 DateTime 时,需要向其添加延迟修饰符,然后显示错误 LateInitializationError: Field 'selectedDay' has not been initialized.

标签: flutter datetime dart flutter-test


【解决方案1】:

如果你把var selectedDate换成下面的那行能用吗

 late DateTime selectedDay;

然后进行如下修改,如下图:

  • 添加toList.map() 方法返回Iterable,您必须将其转换为List 才能将其用作childrenColumn
  • 添加 if 检查以确保在您希望使用 selectedDay 时已分配。
if (selectedDay != null)
                ..._getEventsfromDay(selectedDay).map((Event event) => ListTile(
                      title: Text(event.title),
                    )).toList(),

【讨论】:

  • 感谢 Tim,if 条件帮助解决了这个问题。我仍在使用变量 selected day 作为 var 而不是 DateTime,现在它工作正常。当它是 DateTime 时,它​​产生了另一个错误。现在我的日历屏幕正在渲染中
猜你喜欢
  • 2022-08-23
  • 2021-10-08
  • 1970-01-01
  • 2022-08-18
  • 2021-08-12
  • 2020-09-29
  • 1970-01-01
  • 2022-07-16
  • 2019-08-05
相关资源
最近更新 更多