remember<T extends Object> method

T remember<T extends Object>({
  1. T factory()?,
  2. T factory2(
    1. Lifecycle
    )?,
  3. FutureOr<void> onDispose(
    1. T
    )?,
  4. Object? key,
})

以当前context、类型Tkey为索引 记住该对象,并且以后将再次返回该对象

  • factoryfactory2 如何构建这个对象,不能同时为空, factory 优先级高于 factory2
  • onDispose 定义销毁时如何处理,一定晚于contextdispose,非常注意不可使用context相关内容

Implementation

T remember<T extends Object>({
  T Function()? factory,
  T Function(Lifecycle)? factory2,
  FutureOr<void> Function(T)? onDispose,
  Object? key,
}) {
  if (factory == null && factory2 == null) {
    throw 'factory and factory2 cannot be null at the same time';
  }

  final lifecycle = Lifecycle.of(this);
  final managers = lifecycle.extData.getOrPut<
          Map<BuildContext, _RememberDisposeObserver>>(
      key: _keyRemember,
      ifAbsent: (l) {
        final result =
            WeakHashMap<BuildContext, _RememberDisposeObserver>.identity();

        /// 不持有 Map,防止内存泄漏
        lifecycle.addLifecycleObserver(MapAutoClearObserver(result));
        return result;
      });

  final manager = managers.putIfAbsent(
      this, () => _RememberDisposeObserver._(this, lifecycle));

  return manager.getOrCreate<T>(factory, factory2, onDispose, key);
}