initState method
初始化状态 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);
}
}