From 0efa5d10ff6abb23ce7d7acb939ed7bb9ec146f2 Mon Sep 17 00:00:00 2001
From: Heron <heron.roman@gmail.com>
Date: Tue, 31 Mar 2020 22:48:18 +0800
Subject: [PATCH] [image_picker] fix bug, sometimes double click cancel button
 will crash

---
 .../image_picker/image_picker/CHANGELOG.md    |  4 ++++
 .../ios/Classes/FLTImagePickerPlugin.m        |  4 +++-
 .../ios/Tests/ImagePickerPluginTests.m        | 20 +++++++++++++++++++
 .../image_picker/image_picker/pubspec.yaml    |  2 +-
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md
index 75af68133df8..c557f4ac0a89 100644
--- a/packages/image_picker/image_picker/CHANGELOG.md
+++ b/packages/image_picker/image_picker/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.6+4
+
+* Fix bug, sometimes double click cancel button will crash.
+
 ## 0.6.6+3
 
 * Update README
diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
index d01d0928089e..449157565e7f 100644
--- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
+++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
@@ -326,8 +326,10 @@ - (void)imagePickerController:(UIImagePickerController *)picker
 
 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
   [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
+  if (!self.result) {
+    return;
+  }
   self.result(nil);
-
   self.result = nil;
   _arguments = nil;
 }
diff --git a/packages/image_picker/image_picker/ios/Tests/ImagePickerPluginTests.m b/packages/image_picker/image_picker/ios/Tests/ImagePickerPluginTests.m
index b7f0d71fb95d..e5c681e7d956 100644
--- a/packages/image_picker/image_picker/ios/Tests/ImagePickerPluginTests.m
+++ b/packages/image_picker/image_picker/ios/Tests/ImagePickerPluginTests.m
@@ -10,6 +10,7 @@
 @interface FLTImagePickerPlugin (Test)
 @property(copy, nonatomic) FlutterResult result;
 - (void)handleSavedPath:(NSString *)path;
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
 @end
 
 @interface ImagePickerPluginTests : XCTestCase
@@ -66,6 +67,25 @@ - (void)testPluginPickVideoDeviceBack {
                  UIImagePickerControllerCameraDeviceRear);
 }
 
+- (void)testPluginPickImageDeviceCancelClickMultipleTimes {
+  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
+    return;
+  }
+  FLTImagePickerPlugin *plugin =
+      [[FLTImagePickerPlugin alloc] initWithViewController:[UIViewController new]];
+  FlutterMethodCall *call =
+      [FlutterMethodCall methodCallWithMethodName:@"pickImage"
+                                        arguments:@{@"source" : @(0), @"cameraDevice" : @(1)}];
+  [plugin handleMethodCall:call
+                    result:^(id _Nullable r){
+                    }];
+  plugin.result = ^(id result) {
+
+  };
+  [plugin imagePickerControllerDidCancel:[plugin getImagePickerController]];
+  [plugin imagePickerControllerDidCancel:[plugin getImagePickerController]];
+}
+
 - (void)testPluginPickVideoDeviceFront {
   if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
     return;
diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml
index 5cfba84dc3a5..e9161748db56 100755
--- a/packages/image_picker/image_picker/pubspec.yaml
+++ b/packages/image_picker/image_picker/pubspec.yaml
@@ -2,7 +2,7 @@ name: image_picker
 description: Flutter plugin for selecting images from the Android and iOS image
   library, and taking new pictures with the camera.
 homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker
-version: 0.6.6+3
+version: 0.6.6+4
 
 flutter:
   plugin: