在DART中,在一个类型(例如,String?
)后使用?
表示该变量可以为空,这意味着它可以保存该类型的非空值,也可以为null
.另一方面,如果您声明的变量没有?
(例如,String
),则意味着该变量必须始终包含该类型的非空值.
在您的UserModel
类中,您已经将字段定义为可以为空:
final String? username;
final int? age;
final String? phoneNumber;
这意味着可以为这些字段分配null
个值.应使用可空类型还是不可为空类型取决于应用程序的要求以及您希望如何处理空值.以下是一些考虑因素:
在以下情况下使用可为空的类型(String?
、int?
等):
- 您预计收到的数据可能缺少值或空值,并且您希望在模型中表示这一点.
- 例如,您希望区分空值和空字符串.
- 在访问这些字段时,您希望避免运行时空引用异常.
在以下情况下使用不可为空的类型(String
、int
等):
- 您希望数据始终具有有效的非空值,并且空值将指示编程错误或数据完整性问题.
- 您希望在创建模型实例时强制始终使用有效值来初始化这些字段.
关于您的第二个问题,即如何在模型或控制器中处理空值而不混乱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代码中使用.