Dart中的冒号 :

364 阅读1分钟

在Flutter(以及Dart语言)中,你遇到的这种写法是构造函数的初始化列表语法。这种语法允许在构造函数体执行之前初始化实例变量或执行其他操作。初始化列表对于设置final字段或执行需要在构造函数体执行之前完成的操作特别有用。

让我们逐步解析你提供的代码:

StreamAuth({this.refreshInterval = 20})
      : _userStreamController = StreamController<String?>.broadcast() {
    _userStreamController.stream.listen((String? currentUser) {
      _currentUser = currentUser;
    });
}

这段代码定义了一个名为StreamAuth的类的构造函数,它包括几个部分:

  1. 构造函数参数{this.refreshInterval = 20}

    • 这里定义了一个可选的命名参数refreshInterval,并给它一个默认值20
    • this.refreshInterval = 20意味着如果在构造StreamAuth对象时没有提供refreshInterval参数,那么refreshInterval将默认为20
  2. 初始化列表:_userStreamController = StreamController<String?>.broadcast()

    • 冒号:引入了初始化列表。
    • 在这里,初始化列表用于初始化_userStreamController这个实例变量。_userStreamController被赋值为一个广播(broadcast)类型的StreamController<String?>实例。广播类型的StreamController允许多个监听器监听同一个流。
    • 初始化列表特别适合初始化final字段,或者当你需要在构造函数体执行之前完成某些初始化操作时使用。
  3. 构造函数体

    • 在构造函数体中,通过_userStreamController.stream.listen订阅了_userStreamController流的事件。每当流中有新的currentUser值时,就会更新_currentUser变量。

总的来说,这段代码展示了如何在Flutter中使用初始化列表语法来初始化类的成员变量,并在构造函数体中设置流监听器。这种写法在处理需要初始化并在构造时立即执行某些操作的场景下非常有用。