【问题标题】:Flutter FutureBuilder gives error The method '[]' can't be unconditionally invoked because the receiver can be 'null'Flutter FutureBuilder 报错 The method '[]' can't be unconditionally invoke because the receiver can be 'null'
【发布时间】:2022-01-15 08:22:52
【问题描述】:

使用 Flutter 2.8.1

FutureBuilder 在按索引访问数据时出错

body: FutureBuilder<List<RecordModel>> (
        future: DatabaseProvider.instance.records(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
                itemCount: snapshot.data?.length,
                itemBuilder: (itemBuilder, i) {
                  return ListTile(
                    title: Text(snapshot.data[i].phoneNumber),
                  );
                }
            );
          } else if (snapshot.hasError) {
            return const Center(
              child: Text('Oops...'),
            );
          } else {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
        },
      )

这给出了以下错误

The method '[]' can't be unconditionally invoked because the receiver can be 'null'.

上线

title: Text(snapshot.data[i].phoneNumber),

【问题讨论】:

    标签: flutter dart flutter-futurebuilder


    【解决方案1】:

    在这种情况下,您只需使用! 即可解决此问题,因为您已经在检查snapshot.hasData

    return ListTile(
           title: Text(snapshot.data![i].phoneNumber),
    );
    

    但通常您必须将snapshot.data 存储在局部变量中并检查它是否为空。 Dart 只能提升局部变量,不能提升 getter。因此,即使您检查snapshot.hasDatasnapshot.data != null 也不够,dart 也无法提升 getter。以下来自documentation

    基于流的类型提升不适用于字段,因为静态 分析不能证明该字段的值在 检查 null 的点和使用它的点。 (考虑在病理情况下,场本身可能是 被第二次返回 null 的子类中的 getter 覆盖 它被称为。)

    body: FutureBuilder<List<RecordModel>>(
            future: DatabaseProvider.instance.records(),
            builder: (context, snapshot) {
              final data = snapshot.data;
              if (data != null) {
    
                return ListView.builder(
                    itemCount: snapshot.data?.length,
                    itemBuilder: (itemBuilder, i) {
                      return ListTile(
                        title: Text(data[i].phoneNumber),
                      );
                    });
              } else if (snapshot.hasError) {
                return const Center(
                  child: Text('Oops...'),
                );
              } else {
                return const Center(
                  child: CircularProgressIndicator(),
                );
              }
            },
          ),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-27
      • 2021-10-06
      • 2022-12-02
      • 2022-12-26
      • 2017-10-24
      • 1970-01-01
      • 2022-12-01
      相关资源
      最近更新 更多