Class.new 在 Dart 中做什么

Tze*_*oEM 3 provider class dart flutter riverpod

我目前正在使用 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>{};
  ...
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个“新”属性在这里如何运作。我试图在文档和规范中找到一些内容。
我构建了一个简单的类来检查代码。

class User {
      User();
      final String name = "MisterX";
      final String email = "misterx@gmail.com";
}
void main() {
  
    final x = User.new;
    final z = x();   
    print(z.email);
   
}

Run Code Online (Sandbox Code Playgroud)

现在,“x”在我看来是一个新类,我可以用它创建更多实例。
但这里到底发生了什么?

为什么我可以使用它来创建另一个提供程序实例?

有什么区别:
finalrepositoryProvider = 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>{};
  ...
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是在“marvel.dart”中找到的示例。

Ivo*_*ers 5

.new是一种将引用传递给构造函数的方法。它不会创建一个新类。它只是该类的相同默认构造函数。这也称为构造函数撕裂。它是在 Dart 2.15 中引入的。你可以在这里读更多关于它的内容:

宣布 Dart 2.15

在撰写本文时(2024-02-22及以后),您可以查看此处的规范