如何使用具有空安全性的工厂构造函数
How to use a factory constructor with null safety
我想弄清楚我更新的代码是否是使用具有空安全性的工厂构造函数的正确方法。我回顾了 Whosebug 和 Dart.dev 语言之旅,试图更好地理解工厂构造函数。我一直在努力将概述的概念应用到我的代码中。我是 Flutter、Dart 和编码的新手。这是我第一次尝试使用工厂构造函数,所以主要问题是我缺乏理解,而不是 Whosebug 或其他地方的答案有任何问题。
阅读了大量内容后,我确定了下面标记为已更新的代码中的方法。错误现在都消失了,我的应用程序按我想要的方式运行,但我担心抛出错误而不是返回 null 可能不是一个合理的方法。我的方法在初学者看来是错误的。我的目标是让我的代码正常工作,并理解我为什么使用我正在使用的任何方法,以便我可以将这些知识应用到未来的情况中。我可以提供任何可能需要评论的附加代码。在此先感谢您的帮助。
抛出错误的原始代码
class Job {
Job({required this.name, required this.ratePerHour});
factory Job.fromMap(Map<String, dynamic>? data) {
if (data == null) {
return null;
}
final String name = data['name'];
final int ratePerHour = data['ratePerHour'];
return Job(name: name, ratePerHour: ratePerHour);
}
final String name;
final int ratePerHour;
Map<String, dynamic> toMap() {
return {
'name': name,
'ratePerHour': ratePerHour,
};
}
}
更新后的有效代码
class Job {
Job({required this.name, required this.ratePerHour});
factory Job.fromMap(Map<String, dynamic>? data) {
if (data != null) {
final String name = data['name'];
final int ratePerHour = data['ratePerHour'];
return Job(name: name, ratePerHour: ratePerHour);
} else {
throw ArgumentError('Data is null');
}
}
final String name;
final int ratePerHour;
Map<String, dynamic> toMap() {
return {
'name': name,
'ratePerHour': ratePerHour,
};
}
}
您自己的解决方案工作正常,但我会在致电工厂之前检查数据。
factory Job.fromMap(Map<String, dynamic> data) {
return Job(name: data['name'], ratePerHour: data['ratePerHour']);
}
但话又说回来,为什么不使用数据并调用常规构造函数呢?
Job? job;
if (data != null) {
job = Job(name: data['name'], ratePerHour: data['ratePerHour'])
}
https://dart.dev/guides/language/language-tour#factory-constructors
Factory constructors
Use the factory keyword when implementing a
constructor that doesn’t always create a new instance of its class.
For example, a factory constructor might return an instance from a
cache, or it might return an instance of a subtype. Another use case
for factory constructors is initializing a final variable using logic
that can’t be handled in the initializer list.
您指出了几个真实而好的事实,我觉得您的实现方式是正确的。
我也觉得这个问题没有直接的“正确”答案;我认为这也与 clean code 和 clean architecture 等概念有关,它们比 Dart 和 Flutter 本身更广泛
您可以:
- 抛出并让调用者(上层)处理该问题;
- 打印一些日志和 return 一个零值给调用者(在你的例子中,一个“空”对象)。
如果您不想处理这样的情况,那么情况 1 是可取的。
情况 2 是可取的,如果你能负担得起 return 像 Job("job name",0)
这样奇怪的东西并且仍然很好。
这实际上取决于您要构建的内容。通过查看您的上下文,我可能会选择中间层的选项 1 和 try/catch(也许您想在 data
为 null
时向用户显示“发生错误” )?
我想弄清楚我更新的代码是否是使用具有空安全性的工厂构造函数的正确方法。我回顾了 Whosebug 和 Dart.dev 语言之旅,试图更好地理解工厂构造函数。我一直在努力将概述的概念应用到我的代码中。我是 Flutter、Dart 和编码的新手。这是我第一次尝试使用工厂构造函数,所以主要问题是我缺乏理解,而不是 Whosebug 或其他地方的答案有任何问题。
阅读了大量内容后,我确定了下面标记为已更新的代码中的方法。错误现在都消失了,我的应用程序按我想要的方式运行,但我担心抛出错误而不是返回 null 可能不是一个合理的方法。我的方法在初学者看来是错误的。我的目标是让我的代码正常工作,并理解我为什么使用我正在使用的任何方法,以便我可以将这些知识应用到未来的情况中。我可以提供任何可能需要评论的附加代码。在此先感谢您的帮助。
抛出错误的原始代码
class Job {
Job({required this.name, required this.ratePerHour});
factory Job.fromMap(Map<String, dynamic>? data) {
if (data == null) {
return null;
}
final String name = data['name'];
final int ratePerHour = data['ratePerHour'];
return Job(name: name, ratePerHour: ratePerHour);
}
final String name;
final int ratePerHour;
Map<String, dynamic> toMap() {
return {
'name': name,
'ratePerHour': ratePerHour,
};
}
}
更新后的有效代码
class Job {
Job({required this.name, required this.ratePerHour});
factory Job.fromMap(Map<String, dynamic>? data) {
if (data != null) {
final String name = data['name'];
final int ratePerHour = data['ratePerHour'];
return Job(name: name, ratePerHour: ratePerHour);
} else {
throw ArgumentError('Data is null');
}
}
final String name;
final int ratePerHour;
Map<String, dynamic> toMap() {
return {
'name': name,
'ratePerHour': ratePerHour,
};
}
}
您自己的解决方案工作正常,但我会在致电工厂之前检查数据。
factory Job.fromMap(Map<String, dynamic> data) {
return Job(name: data['name'], ratePerHour: data['ratePerHour']);
}
但话又说回来,为什么不使用数据并调用常规构造函数呢?
Job? job;
if (data != null) {
job = Job(name: data['name'], ratePerHour: data['ratePerHour'])
}
https://dart.dev/guides/language/language-tour#factory-constructors
Factory constructors
Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.
您指出了几个真实而好的事实,我觉得您的实现方式是正确的。
我也觉得这个问题没有直接的“正确”答案;我认为这也与 clean code 和 clean architecture 等概念有关,它们比 Dart 和 Flutter 本身更广泛
您可以:
- 抛出并让调用者(上层)处理该问题;
- 打印一些日志和 return 一个零值给调用者(在你的例子中,一个“空”对象)。
如果您不想处理这样的情况,那么情况 1 是可取的。
情况 2 是可取的,如果你能负担得起 return 像 Job("job name",0)
这样奇怪的东西并且仍然很好。
这实际上取决于您要构建的内容。通过查看您的上下文,我可能会选择中间层的选项 1 和 try/catch(也许您想在 data
为 null
时向用户显示“发生错误” )?