flutter - 在 null Flutter 错误上调用该方法
问题描述
我在其他 StackOverflow 帖子中看到很多人遇到此错误,但是当我努力为自己的代码实现其他问题的答案时。正在使用的代码来自 GitHub 存储库https://github.com/sbis04/events_demo。这就是我调用该方法的方式:
class _ThirdRoute extends State<ThirdRoute> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Calendar"),
),
body: Column(
children: <Widget>[
DashboardScreen(),
],
),
);
}
}
这是另一个 .dart 文件中的方法:
class DashboardScreen extends StatefulWidget {
@override
_DashboardScreenState createState() => _DashboardScreenState();
}
class _DashboardScreenState extends State<DashboardScreen> {
Storage storage = Storage();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.white,
iconTheme: IconThemeData(
color: Colors.grey, //change your color here
),
title: Text(
'Event Details',
style: TextStyle(
fontSize: 22,
),
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => CreateScreen(),
),
);
},
),
body: Padding(
padding: const EdgeInsets.only(
left: 16.0,
right: 16.0,
),
child: Container(
child: StreamBuilder(
stream: storage.retrieveEvents(),
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.documents.length > 0) {
return ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
Map<String, dynamic> eventInfo = snapshot.data.documents[index].data();
EventInfo event = EventInfo.fromMap(eventInfo);
DateTime startTime = DateTime.fromMillisecondsSinceEpoch(event.startTimeInEpoch);
DateTime endTime = DateTime.fromMillisecondsSinceEpoch(event.endTimeInEpoch);
String startTimeString = DateFormat.jm().format(startTime);
String endTimeString = DateFormat.jm().format(endTime);
String dateString = DateFormat.yMMMMd().format(startTime);
return Padding(
padding: EdgeInsets.only(bottom: 16.0),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => EditScreen(event: event),
),
);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.only(
bottom: 16.0,
top: 16.0,
left: 16.0,
right: 16.0,
),
= child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 10),
Text(
event.description,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
SizedBox(height: 10),
Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),
child: Text(
event.link,
),
),
SizedBox(height: 10),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 50,
width: 5,
),
SizedBox(width: 10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
dateString,
),
Text(
'$startTimeString - $endTimeString',
),
],
)
],
),
],
),
),
],
),
),
);
},
);
} else {
return Center(
child: Text(
'No Events',
),
);
}
}
return Center(
child: CircularProgressIndicator(
strokeWidth: 2,
),
);
},
),
),
),
);
}
}
如果有人能给我一些关于如何解决错误的建议:
在 null 上调用了方法 'collection'。接收方:空。尝试调用:集合(“事件”)。相关的导致错误的小部件是 DashboardScreen
编辑这是我在评论中要求的 storage.dart 文件:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'calendar_client.dart';
final CollectionReference mainCollection = FirebaseFirestore.instance.collection('event');
final DocumentReference documentReference = mainCollection.doc('test');
class Storage {
Future<void> storeEventData(EventInfo eventInfo) async {
DocumentReference documentReferencer = documentReference.collection('events').doc(eventInfo.id);
Map<String, dynamic> data = eventInfo.toJson();
print('DATA:\n$data');
await documentReferencer.set(data).whenComplete(() {
print("Event added to the database, id: {${eventInfo.id}}");
}).catchError((e) => print(e));
}
Future<void> updateEventData(EventInfo eventInfo) async {
DocumentReference documentReferencer = documentReference.collection('events').doc(eventInfo.id);
Map<String, dynamic> data = eventInfo.toJson();
print('DATA:\n$data');
await documentReferencer.update(data).whenComplete(() {
print("Event updated in the database, id: {${eventInfo.id}}");
}).catchError((e) => print(e));
}
Future<void> deleteEvent({@required String id}) async {
DocumentReference documentReferencer = documentReference.collection('events').doc(id);
await documentReferencer.delete().catchError((e) => print(e));
print('Event deleted, id: $id');
}
Stream<QuerySnapshot> retrieveEvents() {
Stream<QuerySnapshot> myClasses = documentReference.collection('events').orderBy('start').snapshots();
return myClasses;
}
}
解决方案
推荐阅读
- react-admin - 在useGetList中反应管理员过滤器查询
- python - 如何在python中的numpy中使用FFT和Morlet小波中的采样频率
- java - 带参数的 Java 依赖注入
- sql - 如何对两个不相关的表执行查询
- linux - xargs:如何忽略错误代码 255 并继续迭代?
- python - django中的登录重定向网址
- c++ - 有什么方法可以检测 Windows 批处理文件中的错误?(c++代码编译)
- popup - 如何在产品 shopify 中添加弹出窗口?
- common-lisp - 如何从 .asd 文件的目录编译和运行 Common Lisp 程序?
- javascript - 以响应方式使图像适合划分