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 Photos
或 All Photos
。就我而言,我拒绝了权限,因此控制台上没有错误日志,图像选择器也没有打开。
PS 我知道这与 SO 的问题没有直接关系,但如果有人遇到这个问题可能会有所帮助。
我正在使用 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 Photos
或 All Photos
。就我而言,我拒绝了权限,因此控制台上没有错误日志,图像选择器也没有打开。
PS 我知道这与 SO 的问题没有直接关系,但如果有人遇到这个问题可能会有所帮助。