didUpdateWidget method

  1. @override
void didUpdateWidget(
  1. covariant AliPlayerWidget oldWidget
)
override

状态更新回调 当 Widget 的状态被更新时,该方法被调用。

Called when the state of the widget is updated.

Implementation

@override
void didUpdateWidget(covariant AliPlayerWidget oldWidget) {
  super.didUpdateWidget(oldWidget);

  logi("[lifecycle] didUpdateWidget");

  // 检测控制器是否发生变化
  final controllerChanged = widget._controller != oldWidget._controller;
  if (controllerChanged) {
    final oldController = _playController;

    // 从旧控制器解绑监听器和 context
    oldController._unbindContext(_contextProvider);
    if (_hasFullScreenListener) {
      oldController.isFullScreenNotifier.removeListener(_fullScreenListener);
      _hasFullScreenListener = false;
    }
    oldController.settingPanelRequestNotifier
        .removeListener(_handleSettingPanelRequest);

    // 切换到新控制器
    _playController = widget._controller;

    // 对新控制器绑定 context 和监听器
    _playController._bindContext(_contextProvider);
    if (!_playController.isFullScreenNotifier.value) {
      _playController.isFullScreenNotifier.addListener(_fullScreenListener);
      _hasFullScreenListener = true;
    }
    if (!widget.slotBuilders.containsKey(SlotType.settingMenu)) {
      _playController.settingPanelRequestNotifier
          .addListener(_handleSettingPanelRequest);
    }
  }

  // slotBuilders 变化时刷新插槽顺序缓存
  if (widget.slotBuilders != oldWidget.slotBuilders) {
    _resolvedSlotOrder = _resolveSlotOrder();
  }

  // 控制器或插槽相关 Widget 参数变化时重建上下文与构建器映射
  // 控制器变化时必须重建,否则插槽仍引用旧控制器的 Notifier
  if (controllerChanged ||
      widget.hiddenSlotElements != oldWidget.hiddenSlotElements) {
    _slotBuildContext = _createSlotBuildContext();
    _slotBuilders =
        DefaultSlotFactory.createDefaultBuilders(_slotBuildContext);
  }
}