我試圖找到答案,但我的問題仍然存在。
在我的異步上傳函式中,我回傳影像的生成名稱,我想用它來發出我的資料庫請求。
這是我的上傳功能:
Future<String> upload(File imageFile) async {
var stream =
new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
// get file length
var length = await imageFile.length();
var uri = Uri.parse("http://localhost:8080/upload");
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('file', stream, length,
filename: basename(imageFile.path));
request.files.add(multipartFile);
var response = await request.send();
print(response.statusCode);
var createdFileName = "";
response.stream.transform(utf8.decoder).listen((value) {
createdFileName = value;
print(createdFileName);
});
return createdFileName;
}
我這樣稱呼它:
List createdFileNames = [];
for (var e in imagefiles) {
createdFileNames.add(await upload(File(e)));
}
我不知道為什么,但是 createdFileNames 是 ["",""],但是上傳結果給出了正確的名稱。在除錯模式下,我可以看到,回圈不會等到上傳完成。
你有什么建議嗎?
非常感謝!
uj5u.com熱心網友回復:
response.stream.transform(utf8.decoder).listen((value) {
createdFileName = value;
print(createdFileName);
});
函式中的這部分是異步的,它使用回呼。
但是你不要等待它以任何形式完成。您只需繼續回傳 createdFileName,那個時候很可能還沒有填寫。
我不知道你的流是什么樣子,如果你只需要第一個值,你可以await這樣做而不是聽:
createdFileName = await response.stream.transform(utf8.decoder).first;
uj5u.com熱心網友回復:
代替
response.stream.transform(utf8.decoder).listen((value) {
createdFileName = value;
print(createdFileName);
});
和
createdFileName=await response.stream.bytesToString();
uj5u.com熱心網友回復:
更改代碼
for (var e in imagefiles) {
upload(File(e)).then((value) => createdFileNames.add(value));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498339.html
