Flutter:方法[]在null

时间:2020-09-18 05:36:57

标签: firebase flutter dart

我知道这个问题已经问了很多遍,但是我的问题有点不同。 我正在扑扑的Firebase实时数据库。我在数据库中上载了我现有数据的JSON文件。看起来像this

每个孩子都有4个属性(名称,位置,质量,大小) 子代的ID为0,1,2 ..... 当我在应用程序中检索此数据库时,它可以正常工作,并且显示完美。

当我通过我的应用创建新条目时,孩子的ID是随机的,看起来像 this

之后,当我尝试检索值时,这些值会打印在控制台中,但在屏幕上会显示:-

The method [] was called on null error. Receiver: null. Tried Calling: []("Name")

。 错误屏幕看起来像this。 控制台错误看起来像this

我的检索代码(我将变量提取并传递到另一个屏幕):-

              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')));
                      });

我要去哪里错了?

2 个答案:

答案 0 :(得分:0)

在不访问代码的情况下很难知道,但这通常是我遇到这类问题时要做的事情:

  • 在调试模式下运行代码,并在此行后插入一个中断点: itemBuilder: (BuildContext context, int index) {。这样,您可以内省widget.text.value并查看它是否确实是您期望的对象数组。

  • 否则,请使用较旧的print并开始在itemBuilder中打印widget.text.value[index](甚至先打印widget.text,然后再打印widget.text.value)。多年来,您会惊讶于如何通过低技术打印功能弄清楚人为臭虫;-)

祝你好运

答案 1 :(得分:0)

大约10天后,我的问题终于解决了。 我进行了一些更改:

  1. 我正在使用Cloud Firestore,而不是使用实时数据库。
  2. 代替导入JSON文件,我将手动输入数据。幸运的是,它不是很大,而且之前我也只是手动编写JSON文件。

将数据添加到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

                      );
                }
                  )}
                }
              }
              }
)

如果某些右括号不匹配,我深表歉意。我从非常混乱的代码中提取了这些重要的片段。