0

我正在为一个 Dart 类建模,考虑到新的 null 安全类型。我相信有两种有效的方法来初始化不可为空的属性,从参数计算。

对于此示例,我们将使用 Favorite 类。

此类在构造函数中使用初始化列表。

class Favourite {
  int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(dynamic json)
      : this.favouriteId = json["favouriteId"];
}

这个类使用'late'关键字。

class Favourite {
  late int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(dynamic json) {
    this.favouriteId = json["favouriteId"];
  }
}

您什么时候会使用其中一种?使用“迟到”感觉有风险。如果我添加了另一个命名构造函数,编译器不会抱怨“favouriteId”没有被初始化。

还有其他选择吗?

谢谢!

4

2 回答 2

3

两者都不。

使用初始化字段本身的默认构造函数和处理反序列化json对象的工厂构造函数:

class Favourite {
  final int favouriteId;

  Favourite({required this.favouriteId});

  factory Favourite.fromMap(Map<String, dynamic> map) {
    final favouriteId = json['favouriteId'];
    assert(favouriteId != null && favouriteId is int);
    
    return Favourite(
      favouriteId: favouriteId,
    );
  }
}

如果您处理不当,late关键字可能会令人头疼,因此除非必须,否则一般不要使用它。

于 2021-03-22T21:38:44.877 回答
0

如果你确定 json 总是有一个“favouriteId”,你可以这样写:

class Favourite {
  int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(Map<String, dynamic?> json):
    assert(() {
      final favouriteId = json["favouriteId"];
      return favouriteId != null && favouriteId is int;
    }()),
    favouriteId = json["favouriteId"] as int;
}

void main() {
  
  dynamic m = {"favouriteId":2};
  final favourite = Favourite.mapFromJson(m);
  print("favourite id: ${favourite.favouriteId}");
  
}
于 2021-03-23T08:03:07.397 回答