我正在用 Flutter 构建一个 Instagram 克隆,在上传页面上,我试图通过 Provider 和 Getter 上传图片;代码在这里:
final User user = Provider.of<UserProvider>(context).getUser;
后续代码为
user.photoUrl
下面是提供者类代码:
class UserProvider with ChangeNotifier{
User? _user;
final AuthMethods _authMethods = AuthMethods();
User get getUser => _user!;
Future <void> refreshUser() async {
User user = await _authMethods.getUserDetails();
_user = user;
notifyListeners();
}
}
我尝试上传一张带有图像选择器依赖项的照片。
下面是代码:
pickImage(ImageSource source) async {
final ImagePicker _imagePicker = ImagePicker();
XFile? _file = await _imagePicker.pickImage(source: source);
if (_file != null) {
return await _file.readAsBytes();
}
print("No Image Selected");
}
showSnagBar(String content, BuildContext context) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(content),
),
);
}
我可以正确选择图像。但是在上传的过程中,出现了“Null check operator used on a null value”的错误。调试控制台返回以下内容:
导致错误的相关小部件是
AddPostScreen
global_variables.dart:13
抛出异常时,这是堆栈
#0 UserProvider.getUser
user_provider.dart:14 => 这是 UserProvider 类页面 dart 文件
#1 _AddPostScreenState.build => 这是 AddPostScreen() 页面 dart 文件
改变这个:
User get getUser => _user!;
至:
User? get getUser => _user;
provider 初始化时,_user 为空,根据您的编程逻辑,它可能再次变为空。在这些情况下,如果调用此 getter (getUser),则会发生此 null 异常。这就是为什么您应该谨慎使用空断言运算符 "!"。
考虑以下几点:
refreshUser
或initState()
的init()
方法中调用Provider
,或者FutureBuilder
,确保你在开始的某个地方调用它,因为我在提供的代码中没有看到任何地方。User
可以为空。
final User? user = Provider.of<UserProvider>(context).getUser;
user?.photoUrl
getUser()
可为空。
User? get getUser => _user!;