鎖定2小時。對此問題的評論已被禁用,但它仍在接受新的答案和其他互動。了解更多。
我在某處抓取了以下代碼,將圖片轉換為 base64 字串,而無需訪問檔案:
String ImageToString(Image image) {
String result;
var stream = image.image.resolve(const ImageConfiguration());
stream.addListener(ImageStreamListener((imageInfo, _) async {
var byteData =
await imageInfo.image.toByteData(format: ImageByteFormat.png);
var data = byteData!.buffer
.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
result = base64Encode(data);
}));
// Need to wait for completion here
return result;
}
問題是我需要等待異步任務完成。
- 在這種情況下,我該如何等待完成?
- 或者,是否有同步等待來執行此操作?
uj5u.com熱心網友回復:
在我整整兩天研究的許多其他來源中,根據開發 Dart 的人的以下長時間討論waitFor,Dart現在已被棄用,然后有消失的風險。這甚至還沒有考慮到waitFor由于 Dart 已經在內部適應了 Flutter 而在 Flutter 中從未提供過。它在 Dart 中的棄用使得在可預見的未來幾乎不可能在 Flutter 中引入。
所以在同步代碼中等待異步任務的完成在 Flutter 中是根本不可能的。除非另有證明,否則事情會在幾年后發生變化。結論:如果你的專案不能沒有這個功能,你最好選擇另一種語言和框架。
您將嘗試的所有內容,但未使用await(可能僅在async代碼中使用)then等;只會注冊一個任務以供以后執行,而不是等待它。簡而言之,你把一個瓶子扔進海里,希望它有時會降落在某個地方,而你已經等不及了。
使用 Flutter 的另一種方式;是使幾乎所有東西都異步;因為您可以做的是在異步代碼中同步事物。但這是一個“有點”麻煩恕我直言。您確實需要使async呼叫鏈中的每個例程(即堆疊中的例程)向上達到main!這需要額外的努力,而其他語言可能不需要。
此外,對于任何異步例程,您必須特別注意在引數中傳遞所有需要的資訊以保持資料完整性,因為執行會延遲,并且這些資料可能會在async執行例程之前在您的應用程式中更改。為此,您需要記住將物件的副本傳遞給async例程!事實上,在 Dart/Flutter 中,只有物件的參考是按值傳遞的。這意味著修改物件會產生副作用,從主代碼到async例程(例如,如果要將資料保存在檔案中,則會導致資料損壞)或反向(如果您逐步填寫物件,則會導致資料損壞)例如,長時間計算的結果)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451303.html
上一篇:如何使用javascript 用戶輸入來搜索谷歌圖片并以html顯示?
下一篇:當我嘗試上傳圖片時,Tweepy拋出錯誤。(AttributeError:“dict”物件沒有屬性“media_id_string”)
