美文网首页
Flutter image_picker的两个坑

Flutter image_picker的两个坑

作者: 三三At你 | 来源:发表于2019-10-09 17:52 被阅读0次
  • 两个坑都是用户点击过快才会触发。
  • 同一时刻多次调用delegate 的imagePickerController:didFinishPickingMediaWithInfo:
    时导致 _arguments 被设置为nil 层层传递到CFRelease(cgImage) crash
+ (NSData *)updateMetaData:(NSDictionary *)metaData toImage:(NSData *)imageData {
   NSMutableData *mutableData = [NSMutableData data];
  CGImageSourceRef cgImage = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
  CGImageDestinationRef destination = CGImageDestinationCreateWithData(
      (__bridge CFMutableDataRef)mutableData, CGImageSourceGetType(cgImage), 1, nil);
  CGImageDestinationAddImageFromSource(destination, cgImage, 0, (__bridge CFDictionaryRef)metaData);
  CGImageDestinationFinalize(destination);
  CFRelease(cgImage);
  CFRelease(destination);
  return mutableData;
}
  • 用户多次触发channel调用,导致self.result 设置成nil。然后用户cancel时调用imagePickerControllerDidCancel时 调用self.result未做保护导致crash
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
  if (self.result) {
    self.result([FlutterError errorWithCode:@"multiple_request"
                                    message:@"Cancelled by a second request"
                                    details:nil]);
    self.result = nil;
  }
  //略...
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
  [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
  self.result(nil);

  self.result = nil;
  _arguments = nil;
}

相关issue https://github.com/flutter/flutter/issues/42305#issuecomment-539896119

相关文章

网友评论

      本文标题:Flutter image_picker的两个坑

      本文链接:https://www.haomeiwen.com/subject/mrggpctx.html