在飞镖中使用可为空字段分配值的更好方法

Better way to assign a value with nullable field in dart

有更好的方法吗?

Assignment(
 dueAt: json['due_at'] == null ? 
               null : 
               DateTime.parse(json['due_at']).toLocal()
)

Assignmentclass中的属性“dueAt”可以为空,我需要解析json['due_at']的字符串到 DateTime,但 json['due_at'] 也可以为 null。

现在不是真正的问题,但看起来很吵而且重复。

在这种特殊情况下,您可能希望使用 tryParse 而不是 parse。如果 dueAtDateTime? 类型,您可以简单地调用:

Assignment( dueAt: DateTime.tryParse(json['due_at'])?.toLocal() );

请注意,对于 任何 无效日期字符串(无论是 null 还是格式不正确的字符串),tryParse 都会 return null。这可能是也可能不是所需的行为,具体取决于您的预期用途。

首先,看起来您正在手动编写 JSON 序列化代码。如果你让图书馆来做这件事,你的生活会更轻松,更不容易出错。 json_serializable 非常简单而强大,100% 值得研究。

但是,这种模式在 json 代码之外仍然很常见。

您还可以考虑为 Object? 编写一个扩展方法,它的行为类似于 Kotlin 标准库的 let 函数 (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/let.html) 然后,您可以使用 Dart 的 ?. 语法来处理其余的逻辑:

// extension on T rather than Object? to maintain type information
extension Example<T> on T {
  R let<R>(R Function(T) function) => function(this);
}

这只是将给定函数应用于 this,它本身并不是非常有用,但允许使用 ?.:

final DateTime? dueAt = json['due_at']?.let(DateTime.parse); 

如果 json['due_at'] 的计算结果为 null,则 ?. 运算符短路,并且 dueAt 设置为 null。否则,它的计算结果为 DateTime.parse(json['due_at']).

或者,您可以只使用 package:kt_dart 将大部分 Kotlin 标准库移植到 Dart