【问题标题】:Null Check operator used on null value in Dart Flutter在 Dart Flutter 中对 null 值使用 Null Check 运算符
【发布时间】:2022-08-02 16:48:55
【问题描述】:

由用户用户实例变量引起的 Dart Flutter 中空值错误的空值检查运算符。请帮助如何运行此代码以从 firebase 中获取价值。到目前为止,虚拟用户变量工作正常。 代码:

import \'package:flutter/material.dart\';
import \'package:get/get.dart\';
import \'../models/user.dart\';
import \'../services/database/users_database_services.dart\';

class UserController extends GetxController {
  String userID = \'\';
  bool previouslyLoggedIn = false;
  UserDBService userDBService = UserDBService();

  User? user;
  setUser(String userID, String name, String phone, String email, int usercnic,
      String profilePictureLink) {
    this.userID = userID;
    user = User(
      email: email,
      name: name,
      phone: phone,
      userID: userID,
      usercnic: usercnic,
      profilePictureLink: profilePictureLink,
    );
  }

  updateDbUser() async {
    bool isSuccess = await userDBService.addUser(userID, user!.name,
        user!.phone, user!.email, user!.usercnic, user!.profilePictureLink);

    if (isSuccess) {
      Get.snackbar(
        \"success\",
        \"User details updated successfully\",
        snackPosition: SnackPosition.BOTTOM,
      );
    } else {
      Get.snackbar(
        \"error\",
        \"User details not updated successfully\",
        snackPosition: SnackPosition.BOTTOM,
        backgroundColor: Colors.red,
        colorText: Colors.white,
        duration: const Duration(seconds: 2),
      );
    }
  }
}
  • 你能在这里添加你的错误日志吗?
  • 你确定你总是在updateDbUser()之前调用setUser吗?错误与您调用 user! 有关,这是从可空 (User?) 到不可空 (User) 类型的强制转换。演员将进行运行时检查,以确保您的应用程序在user 最终成为null 时崩溃,即使您已承诺不会出现这种情况。

标签: flutter dart


【解决方案1】:

空检查运算符! 会将其前面的可为空值(可能为空或不为空的变量)视为不可为空。在您的情况下,这是userupdateDbUser 内。

如 cmets 中所述,可能是在设置 user 字段之前调用 updateDbUser 引起的。由于您已经有办法显示失败的更新,我建议如果没有用户,只需将 isSuccess 设置为 false:

updateDbUser() async {
  bool isSuccess = user != null && await userDBService.addUser(...);
  
  ...
}

这应该确保 user 不为空,如果是,它将简单地将 isSuccess 设置为 false 并显示红色横幅。在可能的情况下,建议避免使用空检查运算符!,因为它会导致您出现运行时异常/错误。

【讨论】:

    【解决方案2】:

    在添加用户时添加空值条件,如下所示,或者您可以检查用户是否为空

    bool isSuccess = await userDBService.addUser(userID, user?.name ?? "",
        user?.phone ?? "", user?.email ?? "", user?.usercnic ?? 0, user?.profilePictureLink ?? "");
    

    或者

    bool isSuccess = false;
    
    if(user!= null)
    {
       isSucess = await userDBService.addUser(userID, user?.name ?? "",
                   user?.phone ?? "", user?.email ?? "", user?.usercnic ?? 0, user?.profilePictureLink ?? "");
    }
    

    【讨论】:

    • 嗯,如果user 最终成为null,你想在数据库中创建一个空行吗?
    • 这也是一种解决方案,例如添加带有空检查@julemand101 的用户
    • 我的问题是关于你的代码。您可以看到如果usernull,则每个字段都将被替换为空字符串或0(除了userID)。这很少是你真正想要发生的事情。
    • 请检查更新的@julemand101
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2021-11-06
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多