所以,我正在学习使用FlutterFutureBuilder级.我的代码可以工作,但我想知道我是否可以改进从快照访问数据的方式. 我的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.dataList<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>;这样的类型断言,但我不想走那条路.

有没有可能在不使用!操作员的情况下实现这一点?

谢谢!

推荐答案

你处理builder美元的方式是错误的,试试这个:

builder: (context, snapshot) {
    switch (snapshot.connectionState) {
        case ConnectionState.waiting:
          return Text('Loading....');
        default:
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          } else {
            List<ListCard> data = snapshot.data ?? [];
            return RefreshIndicator(
              onRefresh: _pullRefresh,
              child: _listView(data),
            );
          }
      }
},

这里我将缺省值设置为data,如果它为空,我将传递空列表.

Flutter相关问答推荐

如何在Flutter的easy_translation包中链接嵌套的链接翻译?

如何解决这个错误,同时获得的高度的小部件,因此高度的可用工作区域在Flutter ?

Build.gradle专线:2个Flutter Flutter

有没有一种正确的方法可以通过上下滑动在两个小部件(在我的情况下是应用程序栏)之间切换?

如何在容器小部件中的图像旁边添加文本?

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

抖动问题:检测到0个或2个或更多具有相同值的[DropdownMenuItem]

Flutter在CustomPainter的右上角和左上角添加了2条曲线

flatter_localizations错误在Null值上使用了Null判断运算符

Flutter类调用另一个类中的另一个方法失败

如果其他Provider 的帐户已存在,如何阻止用户登录?

在 Flutter 中更改喜欢按钮的 colored颜色

如何删除或隐藏覆盖

.info/connected 这两个代码之间有什么区别吗?

在 flutter 中使用 Firebase 实时数据库数据创建无限滚动效果

如何在 tabBar 中的选项卡之间制作垂直线?

Flutter 中的 Firebase 后台消息处理程序产生重复的隔离并运行应用程序两次

Flutter Bloc Todo 示例 - 收听存储库中的单个 todo

如何在Flutter 中将列表的模型类型转换为数组?

Flutter audioplayers错误-单击音频按钮时不播放音频