getViewModel<T extends ViewModel> method

T? getViewModel<T extends ViewModel>({
  1. bool ignoreCache = false,
  2. bool ignoreStack = false,
  3. bool ignoreInherited = false,
  4. bool inheritedListen = false,
})

获取当前的或共享的 ViewModel。

优先级先查自身 -> 依赖注入的 -> 再查InheritedWidget

如果需要查找共享的 ViewModel,请将 forceInherited 设置为 true。

ignoreCache 为 true 时,不查找自身的ViewModel, 当 ignoreStack 为 true 时,不查找堆栈中的ViewModel, 当 ignoreInherited 为 true 时,不查找Inherited中的,

inheritedListen 参数决定是否在 ViewModel 发生变化时重新构建。

Implementation

T? getViewModel<T extends ViewModel>({
  bool ignoreCache = false,
  bool ignoreStack = false,
  bool ignoreInherited = false,
  bool inheritedListen = false,
}) {
  // 如果不强制查找共享 ViewModel
  if (!ignoreCache) {
    T? result;
    // 检查当前上下文是否实现了 ConsumerStatefulElement
    if (this is ConsumerStatefulElement) {
      // 从缓存中获取 ViewModel
      result = (this as ConsumerStatefulElement).getViewModel<T>();
    }
    // 如果找到缓存的 ViewModel,直接返回
    if (result != null) {
      return result;
    }
  }

  if (!ignoreInherited) {
    // 查找共享的 ViewModel
    final result = ViewModelProvider.of<T>(this, listen: inheritedListen);
    if (result != null) {
      return result;
    }
  }

  // 查找依赖注入的 ViewModel
  if (!ignoreStack) {
    final result = _getStackCacheViewModel<T>();
    if (result != null) {
      return result;
    }
  }

  return null;
}