didUpdateWidget method
状态更新回调 当 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);
}
}