https://flutter.dev/docs/cookbook/networking/fetch-data
在上述页面的最后一个“完整示例”中,class Album {
final int userId;
final int id;
final String title;
Album({this.userId, this.id, this.title});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
userId: json['userId'],
id: json['id'],
title: json['title'],
);
}
}
这是一个Album类,用于接收请求中收到的JSON字符串,并在应用程序中处理它, 构造函数除了普通构造函数外还提供了工厂构造函数。
关于工厂构造函数, https://dart.dev/guides/language/language-tour#constructors
我已经阅读了上面页面的工厂构造函数部分。
在示例中Logger类的工厂构造函数并不总是创建新实例,因此 我可以理解添加工厂关键字,
即使在这个完整的示例中的Album类中也需要使用工厂构造函数吗?
在Album类的情况下,由于在工厂构造函数中使用了普通构造函数, 我觉得这个工厂构造函数(Album.fromJson)总是会创建一个新的实例。 实际上
Future<Album> fetchAlbum() async {
final response =
await http.get('https://jsonplaceholder.typicode.com/albums/16');
if (response.statusCode == 200) {
// If the server did return a 200 OK response,
// then parse the JSON.
var temp=json.decode(response.body);
return Album(userId:temp['userId'],id:temp['id'],title:temp['title']);
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load album');
}
}
您可以看到,即使我只使用普通构造函数,似乎也没有任何问题。
准备并使用工厂构造函数有什么优势吗?
在这种情况下不使用工厂构造函数是否存在问题?
我不确定何时首先使用工厂构造函数,是否有明确的定义?
Album.fromJson
必须是一个factory
构造函数的任何理由。它可以使用重定向构造函数来实现。那个例子可能为了与使用json_serializable
或built_value
的.fromJson
构造函数保持一致(或出于习惯),因为这些必须使用factory
构造函数。 - jamesdlin