我收到上述带有快照的空检查错误代码。我调查了一些有关堆栈溢出的类似问题,但似乎没有解决我的问题。我对 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: () {},
),
);
}),
);
}
}
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: () {},
),
);
}
}
}),
这是因为您从
snapshot.data
获得的数据是null
。
不要将其存储在变量数据中,而是尝试使用 print(snapshot.data);
,然后你会看到它返回 null。因此,当您检查是否datalength == 0
而不是尝试检查snapshot.data == null
时,它会解决您的问题。
检查 db.getTodo() 函数是否有 ?返回类型,如果是的话就意味着当它为空时future会认为该函数是return。