在主线程上执行颤振异步

时间:2019-04-29 18:30:26

标签: dart async-await

我有一个CameraPreview充满了整个屏幕,底部有一个FloatingActionButton来拍照。

在该按钮的onPress方法上,我正在进行一个网络调用,尽管我对此尚不在乎(结果)。因此,我希望在该方法内部进行的所有操作均以异步方式完成,因此它不会阻塞我的主线程。

这意味着(如果我理解正确的话)我不会使用await关键字。

这是我的onPressed

中的代码
// Attempt to take a picture and log where it's been saved
await controller.takePicture(path);
print("Done taking picture");
sendBase64ToAPI(path);

这是我的sendBase64ToApi方法

Future<String> sendBase64ToAPI(String path) async {

  File(path).readAsBytes().then(thenMethod);
  return null;
}

void thenMethod(List bytes){
  print("Start reading file");
  Image image = decodeImage(bytes);

  int x = ((screenWidth/2) + (overlayWidth/2)).toInt();
  int y = ((screenHeight/2) + (overlayHeight/2)).toInt();

  print("Start cropping image");
  image = copyCrop(image, x, y, overlayWidth, overlayHeight);

  var base64Str = base64.encode(image.getBytes());
  print("Done");

  print(base64Str.substring(0,30));
  print(base64Str.substring(base64Str.length-30,base64Str.length-1));
}

我的UI完全冻结在“开始读取文件”和“开始裁剪图像”之间,尽管它们是异步方法,在没有await的情况下被调用,所以这种情况不会发生。

为什么这些方法不异步执行?

1 个答案:

答案 0 :(得分:0)

好的,this seems to be a known issue来自我正在使用的图书馆。

文档建议在decodeImage中使用Isolate函数。

如果有人发现我的代码中同步的内容,问题将持续几天。