Flutter: 'Lost connection to device.' second time using image_picker to select photo from gallery on iOS

5.1k views Asked by At

I am developing a mobile app in flutter that requires the user to select an image from the gallery.

I am using image_picker: ^0.6.7+11 and here is my code:

if (await Permission.photos.request().isGranted) {
    try {
      final image =
          await ImagePicker().getImage(source: ImageSource.gallery);
      if (image != null) {
        photo.clearData();
        File _image = File(image.path);
        photo.addOriginal(_image);
      } else {
        print('no image selected');
      }
    } on PlatformException catch (e) {
      print('Platform exception $e');
    } catch (e) {
      print('Unknown error: $e');
    }
  }

In the android emulator, everything works fine. In the iOS simulator I am able to choose an image, but if I try to choose a second image then the app crashes and 'Lost connection to device.' is printed in the run tab - but no errors.

Question: How can I fix this so that I can go back to the gallery and select a different image as many times as I want on iOS?

When debugging I have come across this:

PlatformException(multiple_request, Cancelled by a second request, null, null)

I have gone through as many similar questions as I can find on here, GitHub etc... I have:

  • upgraded flutter
  • upgraded pub files
  • flutter clean
  • clean and build in Xcode
  • added 'imageCache.clear()' in flutter code
  • invalidate caches and restart in android studio
  • flutter doctor -v : no issues found
  • checked the permissions (info.plist and added permission_handler package)
  • restarted the simulator
  • erased all contents and settings in simulator
  • debugging with breakpoints weirdly stops the problem from happening a few times then after a few selections the app crashes again ¯\(ツ)

I'm sure its something straight forward but I feel like I have exhausted all my options and not sure where to go from here.

1

There are 1 answers

0
Ziyad Mansy On

Your code is right and it is a simulator problem,if you want to test it on IOS, you have to test on a real IPhone and here is a snippet on how properly you can do it:

final imagePicker = ImagePicker();
    PickedFile pickedFile;
    if (fileType == FileType.Camera) {
      // Camera Part
      pickedFile = await imagePicker.getImage(
        source: ImageSource.camera,
        maxWidth: 480,
        maxHeight: 640,
        imageQuality: 25, // pick your desired quality
      );
      setState(() {
        if (pickedFile != null) {
          _storedFile = File(pickedFile.path);
        } else {
          print('No image selected.');
          return;
        }
      });
    } else if (fileType == FileType.Gallery) {
      // Gallery Part
      pickedFile = await imagePicker.getImage(
        source: ImageSource.gallery,
        maxWidth: 480,
        maxHeight: 640,
        imageQuality: 25,
      );
        } else {
          print('No image selected.');
          return;
        }
      });
    }

and don't forget the enum when the user picks the way he wants to get the image:

enum FileType {
  Gallery,
  Camera,
  Video,
}

Edit: whenever you add a package that depends on native code, you should restart the whole app build b stopping your build and restarting it again so the native code compiles well, don't forget to restart before putting this package in your pubspec.yaml