我正在尝试从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(),
),
);
},
);
}
}
谢谢你们的回答,伙计们,实际上我找到了另一个解决方案,那就是在将图像上传到存储后直接在Firestore中获取并写入URL。
这篇文章对我帮助很大:https://medium.com/swlh/uploading-images-to-cloud-storage-using-flutter-130ac41741b2
(附言:自本文发表以来,一些Firebase名称发生了变化,但它仍然很有帮助。)
当做
您可以使用FutureBuilder,因为StreamBuilder似乎是同步的:
如何转换未来
我想你可以用两种不同的方式混合。在每个构建循环中,您映射文档并请求photoUrl,但在该方法中,您调用setState,它会重新触发您的构建方法。这样的话,您就应该在获取照片url和构建小部件的无限循环中结束。
您有三种选择:
在您的照片项目中:
String imageUrl;
@override
void initState() {
Future.delayed(Duration.zero, () {
setState(() {
// load your data and set it to your variable
imageUrl = ..
});
});
super.initState();
}
我使用等代码从weather API获取数据,但遇到了两个错误: 因此,我在此网站上搜索类似的错误,并在https://stackoverflow.com/a/35053689/13899010找到了部分解决方案,我使用这个解决方案是因为我不想使用资源字符串来更改显示的数据。将此添加到string.xml中:然后将代码更改为: 现在,我得到了以下错误。我在string.format()中看到And
我试图理解为什么当我在MyModel中为T使用更高类型的参数时,以下代码无法编译 但是如果我把它改成< code > new Bar[my model[Any]]它就会编译。这是为什么呢?
当我将值从主页传递到源页面时,它显示了一个错误:参数类型“Future”无法分配给参数类型“uluFunction()”。(argument_type_not_assignable[strong text]lib\home.dart:15) 我哪里做错了?? 主页- 下面的页面是我想使用主页值的地方-
问题内容: 我得到以下错误,尽管它恰好是示例中使用的错误: 错误:类型列表未接受参数 Java是1.7版,该类未命名。 问题答案: 您可能正在导入而不是
这是我运行时得到的结果。我使用的是ionic4版本的Angular 8。
我正在获取cloud firestore的数据&试图通过使用下面的代码在我的应用程序中显示。 我正在使用dart包对其进行格式化。但是,在更新了最新的云firestore插件后,我得到了这个错误- 无法理解如何将此“timestamp”对象解析为“datetime”。因为插件需要DateTime对象格式的数据。