我知道这个问题已经问了很多遍,但是我的问题有点不同。 我正在扑扑的Firebase实时数据库。我在数据库中上载了我现有数据的JSON文件。看起来像this
每个孩子都有4个属性(名称,位置,质量,大小) 子代的ID为0,1,2 ..... 当我在应用程序中检索此数据库时,它可以正常工作,并且显示完美。
当我通过我的应用创建新条目时,孩子的ID是随机的,看起来像 this。
之后,当我尝试检索值时,这些值会打印在控制台中,但在屏幕上会显示:-
The method [] was called on null error. Receiver: null. Tried Calling: []("Name")
我的检索代码(我将变量提取并传递到另一个屏幕):-
ref.once().then((DataSnapshot data) {
datatosend = data;
print(datatosend.value);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DisplayList(
text: datatosend,
title: CategoryItemsitems[index].name),
));
});
我用于显示列表视图的代码:
itemCount: widget.text.value.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ListTile(
leading: IconButton(
icon: Icon(Icons.edit),
onPressed: () {
print("Edit Pressed!");
}),
title: Text(widget.text.value[index]["Name"]),
subtitle: Text("Quality: " +
widget.text.value[index]["Quality"] +
"\nSize: " +
widget.text.value[index]["Size"] +
"\nLocation: " +
widget.text.value[index]["Location"]),
trailing: IconButton(
icon: Icon(
Icons.delete,
color: Colors.red,
),
onPressed: () {
print("Delete Pressed!");
}),
),
);
}),
我用于创建新条目的代码:
databaseReference.child(_category).push().set({
"Name": _name,
"Quality": _quality,
"Size": _size,
"Location": _location
}).then((_) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text('Successfully Added')));
});
我要去哪里错了?
答案 0 :(得分:0)
在不访问代码的情况下很难知道,但这通常是我遇到这类问题时要做的事情:
在调试模式下运行代码,并在此行后插入一个中断点:
itemBuilder: (BuildContext context, int index) {
。这样,您可以内省widget.text.value
并查看它是否确实是您期望的对象数组。
否则,请使用较旧的print
并开始在itemBuilder中打印widget.text.value[index]
(甚至先打印widget.text
,然后再打印widget.text.value
)。多年来,您会惊讶于如何通过低技术打印功能弄清楚人为臭虫;-)
祝你好运
答案 1 :(得分:0)
大约10天后,我的问题终于解决了。 我进行了一些更改:
将数据添加到Firestore的代码。所有这些都在按钮的“ onpressed”参数内。所有输入均采用简单的形式。
firestoreInstance.collection("cars").add({
"Name": _name,
"Quality": _quality,
"Size": _size,
"Location": _location,
}).then((value) {
print("Added Successfully")});
为了获取数据并访问其不同字段,我使用了流构建器:
StreamBuilder(
stream: Firestore.instance
.collection("cars")
.orderBy("Name") //To display the list by Name
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
}
else {
if(snapshot.data.documents.length>0)
{
return ListView.builder(
itemCount: snapshot.data.documents.length, //no. of entries fetched
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(
snapshot.data.documents[index].data()["Name"]), //Accessing the Name property
subtitle: Text("Quality: " +snapshot.data.documents[index].data()["Quality"] + //Accessing the Quality property
"\nSize: " +snapshot.data.documents[index].data()["Size"] + //Accessing the Size property
"\nLocation: " +snapshot.data.documents[index].data()["Location"]) //Accessing the Location property
);
}
)}
}
}
}
)
如果某些右括号不匹配,我深表歉意。我从非常混乱的代码中提取了这些重要的片段。