从日志分析发现的关键问题:
创建了 GlobalWidgetManager 来统一管理所有活跃卡片:
export class GlobalWidgetManager {
private static instance: GlobalWidgetManager | null = null;
private static activeWidgets: Map<string, WidgetSize> = new Map();
// 注册卡片
public registerWidget(formId: string, size: WidgetSize): void
// 注销卡片
public unregisterWidget(formId: string): void
// 获取所有活跃卡片
public getActiveWidgets(): Map<string, WidgetSize>
// 获取活跃卡片数量
public getActiveWidgetCount(): number
}
// 旧代码
this.formSizeMap.set(formId, widgetSize);
// 新代码
this.globalWidgetManager.registerWidget(formId, widgetSize);
// 旧代码
this.formSizeMap.delete(formId);
// 新代码
this.globalWidgetManager.unregisterWidget(formId);
private setupGlobalStateListener(): void {
const avSessionListener = AvSessionWidgetListener.getInstance();
avSessionListener.addStateListener((data: WidgetData) => {
const activeWidgetCount = GlobalWidgetManager.getInstance().getActiveWidgetCount();
hilog.info(0x0000, TAG, `Global listener received update: widgets count: ${activeWidgetCount}`);
// 只有当有活跃卡片时才更新
if (activeWidgetCount > 0) {
this.updateAllWidgetsWithData(data);
} else {
hilog.info(0x0000, TAG, 'No active widgets, skipping update');
}
});
}
private updateAllWidgetsWithData(data: WidgetData): void {
const activeWidgets = this.globalWidgetManager.getActiveWidgets();
hilog.info(0x0000, TAG, `Batch update called, active widgets: ${activeWidgets.size}`);
if (activeWidgets.size === 0) {
hilog.warn(0x0000, TAG, 'No widgets to update');
return;
}
// 更新所有活跃卡片...
}
这个修复应该彻底解决卡片更新的问题,提供更稳定和一致的用户体验。