imagePicker 中的 PlatformException(multiple_request, 被第二个请求取消, null, null)

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

我正在使用 riverpod 提供程序 class 来处理从图库中挑选图像。但是,一旦选择了图像,我就会收到错误消息:PlatformException(multiple_request,被第二个请求取消,null,null)。不确定第二个请求来自哪里。更重要的是,由于这个未知的取消,没有图像应用到我的占位符 (CircleAvartar)。 这是有问题的两个飞镖文件,感谢您的帮助。

imageProvider 文件:

final myImageProvider =
    ChangeNotifierProvider<ImageNotifier>((ref) => ImageNotifier());

class ImageNotifier extends ChangeNotifier {
  ImageNotifier() : super();
  final file = useState<File?>(null);
  final imageFile = useState<XFile?>(null);
  final imagePicker = ImagePicker();

  Future<void> _pickImage(int type) async {
    try {
      XFile? userImage = await imagePicker.pickImage(
        source: type == 1 ? ImageSource.gallery : ImageSource.camera,
        imageQuality: 50,
      );
      imageFile.value = userImage;
      // imageFile.value = XFile(userImage!.path);
    } catch (e) {
      print(e);
    }
    notifyListeners();
  }

  void showPicker(context) {
    showModalBottomSheet(
      backgroundColor: Theme.of(context).primaryColor,
      context: context,
      builder: (BuildContext bc) {
        return SafeArea(
          child: Wrap(
            children: [
              ListTile(
                leading: const Icon(
                  Icons.photo_library,
                  color: Colors.white,
                ),
                title: const Text(
                  'Photo Gallery',
                  style: TextStyle(fontSize: 22),
                ),
                onTap: () => _pickImage(1),
              ),
              ListTile(
                leading: const Icon(
                  Icons.photo_camera,
                  color: Colors.white,
                ),
                title: const Text(
                  'Camera',
                  style: TextStyle(fontSize: 22),
                ),
                onTap: () => _pickImage(2),
              ),
              ListTile(
                leading: const Icon(
                  Icons.close,
                  color: Colors.white,
                ),
                title: const Text(
                  'Cancel',
                  style: TextStyle(fontSize: 22),
                ),
                onTap: () {
                  imageFile.value = null;
                  Navigator.of(context).pop();
                },
              ),
            ],
          ),
        );
      },
    );
    notifyListeners();
  }

AuthScreen dart 文件:

Widget build(BuildContext context, WidgetRef ref) {
    final _passwordController = useTextEditingController();
    final _passwordFocusScope = useFocusNode();
    final _emailFocusScope = useFocusNode();
    final _phoneFocusScope = useFocusNode();
    final _confirmFocusScope = useFocusNode();
    final _isVisible = useState<bool>(true);
    var _authMode = useState<AuthMode>(AuthMode.login);
    final imageProviderState = ref.watch(myImageProvider.notifier);
    final deviceSize = MediaQuery.of(context).size;
    final authMode = ModalRoute.of(context)?.settings.arguments as String;

    switch (authMode) {
      case 'login':
        _authMode.value = AuthMode.login;
        break;
      case 'register':
        _authMode.value = AuthMode.register;
        break;
      case 'google':
        _authMode.value = AuthMode.google;
        break;
      case 'guest':
        _authMode.value = AuthMode.guest;
        break;
    }

    return Scaffold(
      body: Stack(
        children: [
         
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Form(
              key: _formKey,
              child: SingleChildScrollView(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: [
                    const SizedBox(
                      height: 80,
                    ),
                    Center(
                      child: _authMode.value == AuthMode.login
                          ? const Text(
                              'Access Your Account',
                              style: TextStyle(
                                fontSize: 25,
                              ),
                            )
                          : Row(
                              children: [
                                InkWell(
                                  onTap: () =>
                                      imageProviderState.showPicker(context),
                                  // () => ref
                                  // .read(myImageProvider.notifier)
                                  // .showPicker(context),
                                  child: CircleAvatar(
                                    radius: 50,
                                    backgroundImage:
                                        imageProviderState.imageFile.value !=
                                                null
                                            ? FileImage(
                                                //   File(ref
                                                //       .read(imageProvider.notifier)
                                                //       .imageFile
                                                //       .value!
                                                //       .path),
                                                // )
                                                File(imageProviderState
                                                    .imageFile.value!.path),
                                              )
                                            : null,
                                    child: imageProviderState.imageFile.value ==
                                            null
                                        ? const Icon(
                                            Icons.camera,
                                            // Icons.add_photo_alternate,
                                            size: 30,
                                            color: Colors.white,
                                          )
                                        : null,
                                  ),
                                ),

您好,请看一下这个讨论: https://github.com/flutter/flutter/issues/70436

  • image picker package site上我们可以看到这是一个众所周知的苹果模拟器问题。我会说它应该适用于真实设备(或者尝试仅使用 iOS 模拟器照片中的特定图片对其进行测试)

在真实设备(iPhone 和 Android)上测试代码后,我能够 select 并将图库和相机中的照片附加到我的表单中。问题在于尝试在模拟器上执行此任务,即使人们曾经能够这样做。在 Apple 解决此问题之前,请不要再费心了。我的建议是您在真实设备上进行调试以确保一切按编码工作,之后您可以 return 到 simulator/emulator。我浪费了很多时间试图让它在模拟器上工作但无济于事。

除了我之前的回答和在模拟器环境中对开发人员的进一步调整之外,我刚刚发现上传的图像确实显示在 reload/restart 上。很奇怪,但如果您必须在模拟模式下进行测试,则可以使用。只需重新启动,上传的图像就会显示出来。恕我直言,这仍然是模拟器问题。

它可以帮助 double-click 在您从图库中选择的图像上,而不是只单击一次。

无论什么原因,如果我只点击一次,它不会显示,并且出现与您相同的错误。

如果我点击两次会有短暂的滞后,但图像出现了。

在 iOS 模拟器上测试 - 不要在我的 Android 模拟器上遇到这个问题。

确保 ALLOW PHOTO ACCESS 权限设置为 Selected PhotosAll Photos。就我而言,我拒绝了权限,因此控制台上没有错误日志,图像选择器也没有打开。

PS 我知道这与 SO 的问题没有直接关系,但如果有人遇到这个问题可能会有所帮助。