所以,我正在学习使用Flutter
的FutureBuilder级.我的代码可以工作,但我想知道我是否可以改进从快照访问数据的方式.
我的FutureBuilder
是这样的:
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: FutureBuilder<List<ListCard>>(
future: items,
builder: (context, snapshot) {
return RefreshIndicator(
onRefresh: _pullRefresh,
child: _listView(snapshot),
);
},
),
),
);
}
items
是类型Future<List<ListCard>>
的类属性._listView
是我处理快照的方法.此代码中有两个错误:
Widget _listView(AsyncSnapshot<List<ListCard>> snapshot) {
if (snapshot.data != null) {
return ListView.builder(
itemCount: snapshot.data.length, // Error when accessing the length property
itemBuilder: (context, index) {
return snapshot.data[index]; // Error when accessing the index
},
);
} else {
return const Center(child: CircularProgressIndicator());
}
}
这两个错误实际上是相同的.他们说:
不能无条件地访问属性"Length",因为 Receiver可以为‘Null’.try 将访问设置为有条件的(使用‘?.’) 或向目标添加空判断 (‘!’).DART(未选中_使用_可为空的值)
我知道snapshot.data
是List<ListCard>?
类型,因此它的值可以是null
,也可以是List<ListCard>
类型的列表.如果该值为空,Ffltter将显示CircularProcessIndicator
.如果不为空,则返回ListView.builder
小部件.如果达到这一点,snapshot.data
始终是一个列表(它已经在if语句中进行了测试),因此它应该有一个长度属性.
我还试过:
Widget _listView(AsyncSnapshot<List<ListCard>> snapshot) {
if (snapshot.data is List<ListCard>) {
//...
}
但它给出了完全相同的错误. 同样的故事:
Widget _listView(AsyncSnapshot<List<ListCard>> snapshot) {
if (snapshot.hasData) {
//...
}
但是,我可以通过添加!
运算符来消除这些错误:
//...
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return snapshot.data![index];
},
//...
我也可以做诸如List<ListCard> data = snapshot.data as List<ListCard>;
这样的类型断言,但我不想走那条路.
有没有可能在不使用!
操作员的情况下实现这一点?
谢谢!