track<T> static method

T track<T>({
  1. required T useSignal(),
  2. ValueChanged<Signal> onChanged = _defaultOnSignalDoNothing,
  3. ValueChanged<SignalSubscription> onConnected = _defaultOnConnectedImmediatelyClose,
})

在客户程序Widget.build时,会有读操作,比如 Text("username: ${username.value}") Signal.watchRead在useSignalcallback执行期间打开一个封闭的瞬时作用域, 期间的Signal读操作会通知onRead,并用onChanged为key注册监听器

  • onChanged 当watchRead阶段发现有signal的read操作,会把注册onChanged注册到Signal的监听池
  • onConnected 当注册onChanged到的监听池时,会调用此方法,并提供一个dispose钩子给外部程序 外部程序生命周期结束时,可以用dispose移除监听器s

Implementation

static T track<T>({
  required T Function() useSignal,
  ValueChanged<Signal> onChanged = _defaultOnSignalDoNothing,
  ValueChanged<SignalSubscription> onConnected = _defaultOnConnectedImmediatelyClose,
}) {
  /// TODO watchRead时应关闭写通知,因为watchRead是在Widget.build期间调用的,写通知会触发Watcher的setState,不符合flutter规范
  _listenerTempStack.add(_Watcher(onChanged: onChanged, onListen: onConnected));
  try {
    return useSignal();
  } finally {
    _listenerTempStack.removeLast();
  }
}