对空值使用空检查运算符(FutureBuilder)

问题描述 投票:0回答:3

我收到上述带有快照的空检查错误代码。我调查了一些有关堆栈溢出的类似问题,但似乎没有解决我的问题。我对 flutter 还很陌生,非常感谢一些帮助。

这是我的代码。

  var db = DatabaseConnect();

  Todolist({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: FutureBuilder(
          future: db.getTodo(),
          initialData: const [],
          builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
            var data = snapshot.data;
            var datalength = data!.length;

            return datalength == 0
                ? const Center(
                    child: Text('no data found'),
                  )
                : ListView.builder(
                    itemCount: datalength,
                    itemBuilder: (context, i) => Todocard(
                      id: data[i].id,
                      title: data[i].title,
                      creationDate: data[i].creationDate,
                      isChecked: data[i].isChecked,
                      insertFunction: () {},
                      deleteFunction: () {},
                    ),
                  );
          }),
    );
  }
}
flutter snapshot dart-null-safety flutter-futurebuilder null-check
3个回答
1
投票

snapshot.data
在获取数据时首先会返回 null,这就是为什么
snapshot.data
的结果可以为 null。

您收到错误是因为您在下面这一行中处于空状态的

data
变量上使用空检查运算符:

var datalength = data!.length;

解决方案:

您应该检查您的

data
变量是否为空,并显示进度指示器(如果为真)。

如果空检查为假,则可以获得数据的长度。

然后,如果长度为空,则显示空状态消息;如果长度不为空,则显示实际数据。

您的构建器方法可以更新为以下内容:

builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
  var data = snapshot.data;
  if (data == null) {
    return const Center(child: CircularProgressIndicator());
  } else {
    var datalength = data.length;
    if (datalength == 0) {
      return const Center(
        child: Text('no data found'),
      );
    } else {
      return ListView.builder(
        itemCount: datalength,
        itemBuilder: (context, i) => Todocard(
          id: data[i].id,
          title: data[i].title,
          creationDate: data[i].creationDate,
          isChecked: data[i].isChecked,
          insertFunction: () {},
          deleteFunction: () {},
        ),
      );
    }
  }
}),

0
投票

这是因为您从

snapshot.data
获得的数据是
null
。 不要将其存储在变量数据中,而是尝试使用
print(snapshot.data);
,然后你会看到它返回 null。因此,当您检查是否
datalength == 0
而不是尝试检查
snapshot.data == null
时,它会解决您的问题。


0
投票

检查 db.getTodo() 函数是否有 ?返回类型,如果是的话就意味着当它为空时future会认为该函数是return。

© www.soinside.com 2019 - 2024. All rights reserved.