当前位置: 首页 > 知识库问答 >
问题:

Flutter错误:参数类型List

花永昌
2023-03-14

我正在尝试从Firebase Fi还原中列出项目列表(已经完成),并从Firebase云存储中为每个项目获取不同的图像URL。

我使用一个名为getPhotoUrl的函数来更改变量photoUrl的值。问题是返回是在getPhotoUrl之前执行的。如果我在函数getPhotoUrl和async前面加上_docs.map((文档),我得到一个错误,说参数类型列表

我的代码:

class PhotosList extends StatefulWidget {
  @override
  _PhotosListState createState() => _PhotosListState();
}

class _PhotosListState extends State<PhotosList> {
  String photoUrl = 'lib/assets/default-image.png';
  List<DocumentSnapshot> _docs;

  getPhotoUrl(documentID) {
    Reference ref = storage
        .ref('Users')
        .child(currentUser.uid)
        .child('Photos')
        .child(documentID)
        .child('image_1.jpg');
    ref.getDownloadURL().then((value) {
      setState(() {
        photoUrl = value.toString();
      });
    }).catchError((e) {
      setState(() {
        print(e.error);
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: firestore
          .collection('Users')
          .doc(currentUser.uid)
          .collection('Photos')
          .orderBy('date')
          .snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (!snapshot.hasData) return CircularProgressIndicator();
        _docs = snapshot.data.docs;
        if (_docs.isEmpty)
          return Center(
              child: Text("The list is empty."));
        return Container(
          child: ResponsiveGridList(
            desiredItemWidth: 100,
            squareCells: true,
            minSpacing: 5,
            children: _docs.map((document) {
              getPhotoUrl(document.id);
              return PhotosListItem(photoUrl: photoUrl);
            }).toList(),
          ),
        );
      },
    );
  }
}

共有3个答案

劳嘉实
2023-03-14

谢谢你们的回答,伙计们,实际上我找到了另一个解决方案,那就是在将图像上传到存储后直接在Firestore中获取并写入URL。

这篇文章对我帮助很大:https://medium.com/swlh/uploading-images-to-cloud-storage-using-flutter-130ac41741b2

(附言:自本文发表以来,一些Firebase名称发生了变化,但它仍然很有帮助。)

当做

杜河
2023-03-14

您可以使用FutureBuilder,因为StreamBuilder似乎是同步的:

如何转换未来

符懿轩
2023-03-14

我想你可以用两种不同的方式混合。在每个构建循环中,您映射文档并请求photoUrl,但在该方法中,您调用setState,它会重新触发您的构建方法。这样的话,您就应该在获取照片url和构建小部件的无限循环中结束。

您有三种选择:

  1. 加载您的照片URL并将其存储在您的小部件中-

在您的照片项目中:

  String imageUrl;
  
  @override
  void initState() {
    Future.delayed(Duration.zero, () {
      setState(() {
        // load your data and set it to your variable
        imageUrl = ..
      });
    });
    super.initState();
  }
 类似资料: