无法无条件调用方法“[]”,因为接收者可以为“null”

çet*_*kış 25 dart firebase flutter google-cloud-firestore dart-null-safety

我是颤振新手。我正在尝试开发一个应用程序。

\n

我想显示 Firebase 数据库中的人员列表。但是,我收到以下错误。

\n

错误 :

\n
\n

无法无条件调用方法“[]”,因为接收者\n可能为“null”。尝试使调用成为有条件的(使用“?.”)或向目标添加空检查(“!”)。

\n
\n

科德拉\xc4\xb1m :

\n
`import 'package:calendar/page/mainPage.dart';\nimport 'package:flutter/material.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\n\nclass Staff extends StatefulWidget {\n  @override\n  _StaffState createState() => _StaffState();\n}\n\nclass _StaffState extends State<Staff> {\n  \n  final _firestore = FirebaseFirestore.instance;\n\n  @override\n  Widget build(BuildContext context) {\n    // ignore: unused_local_variable\n    CollectionReference staffRef = _firestore.collection('staff');\n\n    return Scaffold(\n      appBar: AppBar(\n        title: Text("Personel Listesi"),\n        backgroundColor: Colors.redAccent[400],\n        actions: <Widget>[\n          IconButton(\n            icon: Icon(Icons.home),\n            onPressed: () {\n              Navigator.pushAndRemoveUntil(\n                  context,\n                  MaterialPageRoute(builder: (_) => MainPage()),\n                  (route) => true);\n            },\n          ),\n        ],\n      ),\n      body: Container(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Center(\n            child: Column(\n              children: [\n                StreamBuilder<QuerySnapshot>(\n                  stream: staffRef.snapshots(),\n                  builder: (BuildContext context, AsyncSnapshot asyncSnapshot) {\n                    if (asyncSnapshot.hasError) {\n                      return Center(\n                          child: Text(\n                              "Bir hata olu\xc5\x9ftu, l\xc3\xbctfen tekrar deneyiniz."));\n                    } else {\n                      if (asyncSnapshot.hasData) {\n                        List<DocumentSnapshot> listStaff =\n                            asyncSnapshot.data.docs;\n                        return Flexible(\n                          child: ListView.builder(\n                              itemBuilder: (context, index) {\n                                return Card(\n                                  elevation: 20,\n                                  color: Colors.greenAccent[200],\n                                  child: ListTile(\n                                    trailing: IconButton(\n                                      icon: Icon(Icons.delete),\n                                      onPressed: () async {\n                                        await listStaff[index]\n                                            .reference\n                                            .delete();\n                                      },\n                                    ),\n                                    title: Text(\n                                      '${listStaff[index].data['nameSurname']}',\n                                      style: TextStyle(fontSize: 20),\n                                    ),\n                                    subtitle: Column(\n                                      children: [\n                                        Row(\n                                          mainAxisAlignment:\n                                              MainAxisAlignment.start,\n                                          children: [\n                                            Text(\n                                              '${listStaff[index].data['tip']}',\n                                              style: TextStyle(fontSize: 14),\n                                            ),\n                                          ],\n                                        ),\n                                        Row(\n                                          mainAxisAlignment:\n                                              MainAxisAlignment.start,\n                                          children: [\n                                            Text(\n                                              '${listStaff[index].data['mail']}',\n                                              style: TextStyle(fontSize: 14),\n                                            ),\n                                          ],\n                                        ),\n                                        Row(\n                                          mainAxisAlignment:\n                                              MainAxisAlignment.start,\n                                          children: [\n                                            Text(\n                                              '${listStaff[index].data['phone']}',\n                                              style: TextStyle(fontSize: 14),\n                                            ),\n                                          ],\n                                        ),\n                                      ],\n                                    ),\n                                  ),\n                                );\n                              },\n                              itemCount: listStaff.length),\n                        );\n                      } else {\n                        return Center(\n                          child: CircularProgressIndicator(),\n                        );\n                      }\n                    }\n                  },\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n`\n
Run Code Online (Sandbox Code Playgroud)\n

çet*_*kış 20

在新的flutter更新中,我们不需要添加.data()

我的代码如下

title: Text(
                                  **'${listStaff[index].data['nameSurname']}',**
                                  style: TextStyle(fontSize: 20),
                                ),
Run Code Online (Sandbox Code Playgroud)

像这样更改它修复了错误。

title: Text(
                                  **'${listPersonel[index]['nameSurname']}'**,
                                  style: TextStyle(fontSize: 20),
                                ),
Run Code Online (Sandbox Code Playgroud)


Cop*_*oad 17

问题:

List如果您访问可为 null或 的元素,则会出现此错误Map。让我们了解一下 a List,您可以将相同的解决方案应用于您的Map.

例如:

List<int>? someList;

void main() {
  int a = someList[0]; // Error
}
Run Code Online (Sandbox Code Playgroud)

解决方案:


对于那些使用FutureBuilder/的人StreamBuilder

您可以通过两种方式解决该错误:

  • FutureBuilder为您的/指定一个类型StreamBuilder

    FutureBuilder<List<int>>( // <-- type 'List<int>' is specified.
      future: _listOfInt(),
      builder: (_, snapshot) {
        if (snapshot.hasData) {
          List<int> myList = snapshot.data!; // <-- Your data
        }
        return Container();
      },
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 用于as向下转换Object为您的类型,例如 aListMap

    FutureBuilder(
      future: _listOfInt(),
      builder: (_, snapshot) {
        if (snapshot.hasData) {
          var myList = snapshot.data! as List<int>; // <-- Your data using 'as'
        }
        return Container();
      },
    )
    
    Run Code Online (Sandbox Code Playgroud)


Wik*_*tor 2

这是一个典型的空安全相关错误。我没有尝试该代码,我猜想可能分配给 asyncSnapshot.data.docs可能listStaff会返回null,但您声明的类型List<DocumentSnapshot>不允许这样做。如果您 100% 确定此赋值不会返回 null 值,则可以添加 '!' 确保编译器将是列表,因此它可以让您使用方法。不过,如果您希望此列表为空,您可以简单地添加“?” 显示它,而不是使用“?” 来使用方法。它的工作原理如下:检查对象是否为空,只有在不为空时才执行此方法。