Flutter点击插入图片时抛出'then' was called on null错误如何解决
问题根因
报错的直接原因是你写的_pickImage()是空实现,没有任何返回值,默认返回null,在InkWell的onTap回调中对null调用.then()方法,直接触发NoSuchMethodError: The method 'then' was called on null异常。
另外你当前的_pickImage()定义在_RegistrationScreenState类外部,根本访问不到类中初始化好的ImagePicker _picker实例,就算补了逻辑也会报上下文访问错误。
修复步骤
- 第一步:删除类外空的
_pickImage()方法,在_RegistrationScreenState类内部补全图片选择逻辑,返回正确的Future<XFile?>类型结果:
// 放到类内部,比如signUp方法前面即可 Future<XFile?> _pickImage() async { try { // 选身份证优先用相册选择,需要拍照的话把source改成ImageSource.camera即可 final XFile? res = await _picker.pickImage( source: ImageSource.gallery, imageQuality: 85, ); return res; } catch (e) { Fluttertoast.showToast(msg: "选择图片失败,请检查相册权限"); return null; } }
- 第二步:替换InkWell组件中原有onTap回调的写法,不要直接链式调用then,改用await接收结果并做空判断,覆盖用户取消选图、选择失败的边界场景:
onTap: () async { final pickedImg = await _pickImage(); if (pickedImg != null) { setState(() { _logo = pickedImg; }); } },
可选优化
你原有代码中确认密码的校验逻辑有问题,当前是判断两个输入框的文本长度是否相等,应该判断文本内容是否一致,把validator里的判断条件替换成下面的代码即可:
validator: (value) { if (value!.isEmpty) { return "Please Enter Confirm Password"; } if (value != passwordEditingController.text) { return "Password Does Not Match"; } return null; },
内容的提问来源于stack exchange,提问作者Howard Tan
相关产品推荐
相关产品推荐

