用于空值的空检查运算符 - 提供者和获取者错误的状态管理

问题描述 投票:0回答:2

我正在用 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 文件

flutter dart nullable flutter-provider state-management
2个回答
0
投票

改变这个:

User get getUser => _user!;

至:

User? get getUser => _user;

provider 初始化时,_user 为空,根据您的编程逻辑,它可能再次变为空。在这些情况下,如果调用此 getter (getUser),则会发生此 null 异常。这就是为什么您应该谨慎使用空断言运算符 "!"


0
投票

考虑以下几点:

  1. refreshUser
    initState()
    init()
    方法中调用
    Provider
    ,或者
    FutureBuilder
    ,确保你在开始的某个地方调用它,因为我在提供的代码中没有看到任何地方。
  2. User
    可以为空。
    final User? user = Provider.of<UserProvider>(context).getUser;
    
    user?.photoUrl
    
  3. 使函数
    getUser()
    可为空。
    User? get getUser => _user!;
    
© www.soinside.com 2019 - 2024. All rights reserved.