我目前正在使用 Riverpod 处理 Flutter 等问题。在其中一个示例中,我遇到了以下代码行。
最终repositoryProvider = Provider(MarvelRepository.new);
final repositoryProvider = Provider(MarvelRepository.new);
class MarvelRepository {
MarvelRepository(
this.ref, {
int Function()? getCurrentTimestamp,
}) : _getCurrentTimestamp = getCurrentTimestamp ??
(() => DateTime.now().millisecondsSinceEpoch);
final Ref ref;
final int Function() _getCurrentTimestamp;
final _characterCache = <String, Character>{};
...
...
...
}
我想知道这个“新”属性在这里是如何运作的。我试图在文档和规范中找到一些东西。
我构建了一个简单的类来检查代码。
class User {
User();
final String name = "MisterX";
final String email = "[email protected]";
}
void main() {
final x = User.new;
final z = x();
print(z.email);
}
“x”现在对我来说似乎是一个新类,我可以用它创建更多实例。
但这里到底发生了什么?
为什么我可以用它来创建另一个提供程序实例?
有什么区别:
最终的repositoryProvider = Provider((ref) => MarvelRepository(ref));
final repositoryProvider = Provider<MarvelRepository>((ref) => MarvelRepository(ref));
class MarvelRepository {
MarvelRepository(
this.ref, {
int Function()? getCurrentTimestamp,
}) : _getCurrentTimestamp = getCurrentTimestamp ??
(() => DateTime.now().millisecondsSinceEpoch);
final Ref ref;
final int Function() _getCurrentTimestamp;
final _characterCache = <String, Character>{};
...
...
...
}
这是在“marvel.dart”中找到的示例。
.new
是一种将引用传递给构造函数的方法。它不会创建新类。它只是该类的相同默认构造函数。这也称为构造函数撕裂。它是在 Dart 2.15 中引入的。您可以在这里阅读更多相关信息:
在撰写本文时(2024-02-22 及以后),您可以查看规格此处