initState method

  1. @override
void initState()
override

初始化状态 StatefulWidget 的状态类中第一个被调用的方法,用于初始化状态,可以执行一些一次性的初始化工作

Called when the state is first created. Used for one-time initialization.

Implementation

@override
void initState() {
  super.initState();

  logi("[lifecycle] initState");

  /// 获取播放控制器
  _playController = widget._controller;

  /// 绑定 context provider
  _contextProvider = () => context;
  _playController._bindContext(_contextProvider);

  /// 捕获本实例身份:initState 时若已处于全屏,则本实例位于全屏路由内部
  _isInsideFullScreenRoute = _playController.isFullScreenNotifier.value;

  /// 初始化共享动画管理器
  _animationManager = SharedAnimationManager(this);

  /// 缓存插槽渲染顺序(与场景类型无关)
  _resolvedSlotOrder = _resolveSlotOrder();

  /// 创建插槽构建依赖上下文与构建器映射
  _slotBuildContext = _createSlotBuildContext();

  /// 创建默认插槽构建器映射
  _slotBuilders = DefaultSlotFactory.createDefaultBuilders(_slotBuildContext);

  /// 添加观察者
  WidgetsBinding.instance.addObserver(this);

  /// 仅在非全屏上下文中注册全屏监听,防止全屏路由中的 AliPlayerWidget 再次 push
  if (!_playController.isFullScreenNotifier.value) {
    _playController.isFullScreenNotifier.addListener(_fullScreenListener);
    _hasFullScreenListener = true;
  }

  /// 监听设置面板请求
  /// 仅在未自定义 settingMenu 时监听,否则由用户的自定义插槽处理。
  /// 每个 State 实例(竖屏/全屏)各自注册,
  /// 由 [_handleSettingPanelRequest] 内的全屏身份匹配守卫决定谁响应。
  if (!widget.slotBuilders.containsKey(SlotType.settingMenu)) {
    _playController.settingPanelRequestNotifier
        .addListener(_handleSettingPanelRequest);
  }
}