【发布时间】: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()],
));
}
}
我不确定为什么会发生此错误,但如果您能帮助我解决这个问题,那将是非常有帮助的。提前致谢
【问题讨论】:
-
你能突出显示错误发生在哪一行吗?很难像这样排除故障。
-
尝试将
selectedDay和focusedDay的声明从 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