我是Flutter的新手,我正在尝试开发一个应用程序。
我想显示Firebase数据库中的人员列表。但是,我得到了以下错误。
- 错误:**
无法无条件调用方法"[]",因为接收方可以为"null"。请尝试使调用具有条件(使用"?.")或向目标("!")添加null检查。
科达勒姆:
`import 'package:calendar/page/mainPage.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class Staff extends StatefulWidget {
@override
_StaffState createState() => _StaffState();
}
class _StaffState extends State<Staff> {
final _firestore = FirebaseFirestore.instance;
@override
Widget build(BuildContext context) {
// ignore: unused_local_variable
CollectionReference staffRef = _firestore.collection('staff');
return Scaffold(
appBar: AppBar(
title: Text("Personel Listesi"),
backgroundColor: Colors.redAccent[400],
actions: <Widget>[
IconButton(
icon: Icon(Icons.home),
onPressed: () {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => MainPage()),
(route) => true);
},
),
],
),
body: Container(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Column(
children: [
StreamBuilder<QuerySnapshot>(
stream: staffRef.snapshots(),
builder: (BuildContext context, AsyncSnapshot asyncSnapshot) {
if (asyncSnapshot.hasError) {
return Center(
child: Text(
"Bir hata oluştu, lütfen tekrar deneyiniz."));
} else {
if (asyncSnapshot.hasData) {
List<DocumentSnapshot> listStaff =
asyncSnapshot.data.docs;
return Flexible(
child: ListView.builder(
itemBuilder: (context, index) {
return Card(
elevation: 20,
color: Colors.greenAccent[200],
child: ListTile(
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () async {
await listStaff[index]
.reference
.delete();
},
),
title: Text(
'${listStaff[index].data['nameSurname']}',
style: TextStyle(fontSize: 20),
),
subtitle: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['tip']}',
style: TextStyle(fontSize: 14),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['mail']}',
style: TextStyle(fontSize: 14),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'${listStaff[index].data['phone']}',
style: TextStyle(fontSize: 14),
),
],
),
],
),
),
);
},
itemCount: listStaff.length),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}
},
),
],
),
),
),
),
);
}
}
`
5条答案
按热度按时间wztqucjr1#
在新的Flutter更新中,我们不需要添加
.data()
我的代码如下
按此方式更改已修复错误。
mpgws1up2#
问题:
如果你访问一个可以为空的
List
或Map
上的元素,你会得到这个错误。让我们来理解一下List
的错误,你可以对你的Map
应用同样的解决方案。例如:
溶液:
?
和??
**:List
不是null
时,才使用**!
**bang运算符。对于使用
FutureBuilder
/StreamBuilder
的用户:可以通过两种方式解决错误:
FutureBuilder
/StreamBuilder
的类型as
将Object
向下转换为您的类型,例如List
或Map
。mw3dktmi3#
我和提问者有同样的问题,解决方案来自这个帖子。我把它留在这里,以防其他人有这个问题。https://fileidea.com/2021/05/05/method-cant-be-unconditionally-invoked-because-the-receiver-can-be-null-with-firestore/
之前:
yptwkmov4#
这是一个典型的与null安全相关的错误。我没有尝试代码,我猜测可能将
asyncSnapshot.data.docs
赋值给listStaff
可能会返回null,但您声明的类型List<DocumentSnapshot>
不允许这样做。如果您100%确定此赋值不会返回null值,您可以添加“!”以确保编译器,它将是List,所以它允许你使用方法。2如果你想让这个列表为空,你可以简单地添加'?'来显示它,然后使用'?.'来使用方法。3它的工作原理如下:检查对象是否为null,仅当对象不为null时才对此方法执行方法。gojuced75#
如果您使用FutureBuilder,请尝试FutureBuilder
有关Firebase的信息,请访问snapshot.data![“您的数据”]