我有一个模型,看起来是这样的

 class UserModel {
  final String? username;
  final int? age;
  final String? phoneNumber;

  UserModel(
      {required this.age, required this.phoneNumber, required this.username});

  @override
  String toString() {
    return 'Username => $username\nAge => $age\nPhone number => $phoneNumber';
  }
}

现在让我困惑的是,什么更适合使用?还是不要?比如final String? usernamefinal String username

如果我从服务器username获得的数据是空的,我该如何处理呢?我想保持用户界面代码尽可能干净,所以我不想把if(user.username == null)放在用户界面中,我想把它放在模型或控制器中,如何保持它?

推荐答案

在DART中,在一个类型(例如,String?)后使用?表示该变量可以为空,这意味着它可以保存该类型的非空值,也可以为null.另一方面,如果您声明的变量没有?(例如,String),则意味着该变量必须始终包含该类型的非空值.

在您的UserModel类中,您已经将字段定义为可以为空:

final String? username;
final int? age;
final String? phoneNumber;

这意味着可以为这些字段分配null个值.应使用可空类型还是不可为空类型取决于应用程序的要求以及您希望如何处理空值.以下是一些考虑因素:

  1. 在以下情况下使用可为空的类型(String?int?等):

    • 您预计收到的数据可能缺少值或空值,并且您希望在模型中表示这一点.
    • 例如,您希望区分空值和空字符串.
    • 在访问这些字段时,您希望避免运行时空引用异常.
  2. 在以下情况下使用不可为空的类型(Stringint等):

    • 您希望数据始终具有有效的非空值,并且空值将指示编程错误或数据完整性问题.
    • 您希望在创建模型实例时强制始终使用有效值来初始化这些字段.

关于您的第二个问题,即如何在模型或控制器中处理空值而不混乱UI代码,您可以通过在构造UserModel对象时提供默认值或转换数据来实现这一点.下面是一个如何在模型构造函数中处理空值的示例:

class UserModel {
  final String username;
  final int age;
  final String phoneNumber;

  UserModel({
    String? username,
    int? age,
    String? phoneNumber,
  })  : username = username ?? 'Default Username',
        age = age ?? 0,
        phoneNumber = phoneNumber ?? 'N/A';

  @override
  String toString() {
    return 'Username => $username\nAge => $age\nPhone number => $phoneNumber';
  }
}

在这个修改的UserModel中,如果提供的任何值(用户名、年龄或电话号码)是null,则它将缺省为指定值(例如,用户名的默认用户名),而不是允许空值.这样,您可以确保您的UserModel始终包含非空值,这可以使其更容易在UI代码中使用.

Flutter相关问答推荐

如何在Flutter 屏幕中添加箭头形状

在Flutter中创建具有固定行的压缩水平列表

为什么Flutter InAppWebView中的DatePicker看起来很旧?

如何将Will POP示波器转换为POP数据抖动的POP示波器

ReCAPTCHA Enterprise中的严重安全漏洞

摆动更改标记可轻敲文本按钮样式

按一下按钮即可更新 fl_chart

为什么我的Flutter 动画过渡没有发生?

Firestore 不会取代 map

ScaffoldMessenger 在等待键下方不起作用

获取通过列表呈现的相同 TextEditingController 的值

允许文本小部件在容器之间溢出

在 Flutter 中,SpinEdit 叫什么?

如何使用 riverpod_annotation 创建非自动处置提供程序?

Flutter RIverpod 奇怪地改变状态

Flutter 本地通知在最新版本中不起作用

Flutter :RangeError(索引):无效值:不在包含范围内0..3:4使用IndexedListView.builder

如何将图像网络装箱到具有边界半径的容器中

在自动完成中 Select 值后保持键盘焦点

如何从用户 Flutter 导航抽屉中隐藏管理菜单