Future dart/flutter 中的返回值
Posted
技术标签:
【中文标题】Future dart/flutter 中的返回值【英文标题】:Return value in Future dart/flutter 【发布时间】:2020-01-05 08:00:41 【问题描述】:为什么返回值总是空?
_repository.addUpdateWorkOrder(workOrder).listen((ref)
image.id = ref.documentID;
_repository
.getImageDownloadUrl(ref.documentID, image.imagePath)
.then((val)
print('The value of the input is: $val');
);
);
存储库
@override
Future<List<String>> getImageDownloadUrl(
String id, List<Asset> imagePath) async
Future.wait(imagePath.map((Asset asset) async
ByteData byteData = await asset.requestOriginal();
List<int> imageData = byteData.buffer.asUint8List();
var dateTime = new DateTime.now();
final StorageReference firebaseStorageRef = FirebaseStorage.instance
.ref()
.child('images/' + id + '/' + dateTime.toString() + ' .jpg');
return firebaseStorageRef.putData(imageData).onComplete.then(
(uploadTask) =>
uploadTask.ref.getDownloadURL().then((url) => url.toString()));
));
输出
I/flutter(22901):输入的值为:null
【问题讨论】:
uploadTask
也为空?
@PeterHaddad 没有。当我调试时,我可以看到 url 上有值。
@PeterHaddad 在我调试时,它会先运行print('The value of the input is: $val');
,然后只运行getImageDownloadUrl
方法...
您不能从 then
方法返回值,您应该改用 await
并将结果分配给新变量,然后再次使用它。我所说的只是getImageDownloadUrl
函数中的代码。
@JohnJoe,请检查这个gist 是为你编码的,并告诉我它是否有效或发生了什么?
【参考方案1】:
当我们在 cmets 中讨论问题时,我们终于找到了一个解决方案,因为我们编辑了 getImageDownloadUrl
函数,就像在这个 gist 中一样。
下面是代码
@override
Future<List<String>> getImageDownloadUrl(
String id, List<Asset> imagePath) async
// Variable to hold the list of urls.
// Also I think you need only one String not List.
List<String> list = List<String>();
for (Asset asset in imagePath)
ByteData byteData = await asset.requestOriginal();
List<int> imageData = byteData.buffer.asUint8List();
var dateTime = new DateTime.now();
final StorageReference firebaseStorageRef = FirebaseStorage.instance
.ref()
.child('images/' + id + '/' + dateTime.toString() + ' .jpg');
// Using await to hold the value that result.
var uploadTask = await firebaseStorageRef.putData(imageData).onComplete;
String url = await uploadTask.ref.getDownloadURL();
// Add the url to list
list.add(url);
return list;
【讨论】:
以上是关于Future dart/flutter 中的返回值的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?
Dart / Flutter:Isolate ***函数的异步行为