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

5lhxktic  于 2022-12-24  发布在  其他
关注(0)|答案(5)|浏览(269)

我是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(),
                        );
                      }
                    }
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
`
wztqucjr

wztqucjr1#

在新的Flutter更新中,我们不需要添加.data()
我的代码如下

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

按此方式更改已修复错误。

title: Text(
                                  **'${listPersonel[index]['nameSurname']}'**,
                                  style: TextStyle(fontSize: 20),
                                ),
mpgws1up

mpgws1up2#

问题:

如果你访问一个可以为空的ListMap上的元素,你会得到这个错误。让我们来理解一下List的错误,你可以对你的Map应用同样的解决方案。
例如:

List<int>? someList;

void main() {
  int a = someList[0]; // Error
}

溶液:

  • 使用局部变量
var list = someList;
if (list != null) {
  int a = list[0]; // No error
}
  • 使用**???**:
int a = someList?[0] ?? -1; // -1 is the default value if List was null
  • 仅当您确定List不是null时,才使用**!**bang运算符。
int a = someList![0];

对于使用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();
  },
)
  • 使用asObject向下转换为您的类型,例如ListMap
FutureBuilder(
  future: _listOfInt(),
  builder: (_, snapshot) {
    if (snapshot.hasData) {
      var myList = snapshot.data! as List<int>; // <-- Your data using 'as'
    }
    return Container();
  },
)
mw3dktmi

mw3dktmi3#

我和提问者有同样的问题,解决方案来自这个帖子。我把它留在这里,以防其他人有这个问题。https://fileidea.com/2021/05/05/method-cant-be-unconditionally-invoked-because-the-receiver-can-be-null-with-firestore/
之前:

final mySnapStream = messagesCollection
.orderBy('date', descending: true)
.limit(100)
.snapshots()
.map((obj) => obj.docs
    .map((e) => new MyItem(
        e.data()['myFieldOne'],
        e.data()['myFieldThree'],
        e.data()['myFieldFour']))
    .toList());

after:

    final mySnapStream = messagesCollection
  .orderBy('date', descending: true)
  .limit(100)
  .snapshots()
  .map((obj) => obj.docs
      .map((e) => new MyItem(
          (e.data() as dynamic)['myFieldOne'],
          (e.data() as dynamic)['myFieldThree'],
          (e.data() as dynamic)['myFieldFour']))
      .toList());
yptwkmov

yptwkmov4#

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

gojuced7

gojuced75#

如果您使用FutureBuilder,请尝试FutureBuilder
有关Firebase的信息,请访问snapshot.data![“您的数据”]

相关问题