HarmonyOS 鸿蒙Next 同一个组件绑定两个半模态问题解析:前一个半模态拉起后迅速关闭,后一个半模态运转正常的原因探讨。代码示例如下

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 同一个组件绑定两个半模态问题解析:前一个半模态拉起后迅速关闭,后一个半模态运转正常的原因探讨。代码示例如下

@Entry
@Component
struct TestPage {
@State isShowDelete: boolean = false;
@State isShowEdit: boolean = false;

@Builder
deleteItem() {
Text(‘删除测试’)
.margin({ bottom: 30 })
}

@Builder
updateItem() {
Text(‘更新测试’)
.margin({ bottom: 30 })
}

build() {
Column({ space: 10 }) {
Button(‘按钮1’)
.onClick(() => {
this.isShowDelete = true;
})
Button(‘按钮2’)
.onClick(() => {
this.isShowEdit = true;
})
Button(‘展示’)// 删除转场
// 问题:这个转场,闪一下就没有了
.bindSheet($$this.isShowDelete, this.deleteItem(), {
height: SheetSize.FIT_CONTENT,
title: { title: ‘计划删除’ },
onDisappear: () => {
this.isShowDelete = false;
},
maskColor: ‘#1a030303’
})// 更新转场
.bindSheet($$this.isShowEdit, this.updateItem(), {
height: SheetSize.FIT_CONTENT,
title: { title: ‘计划更新’ },
onDisappear: () => {
this.isShowEdit = false;
},
maskColor: ‘#1a030303’
})
}
.height(‘100%’)
.width(‘100%’)
.margin({ top: 60 })
}
}


更多关于HarmonyOS 鸿蒙Next 同一个组件绑定两个半模态问题解析:前一个半模态拉起后迅速关闭,后一个半模态运转正常的原因探讨。代码示例如下的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复
[@Entry](/user/Entry)
[@Component](/user/Component)
struct TestPage {
[@State](/user/State) isShowDelete: boolean = false;
[@State](/user/State) isShowEdit: boolean = false;

[@Builder](/user/Builder)
deleteItem() {
Text('删除测试')
.margin({ bottom: 30 })
}

[@Builder](/user/Builder)
updateItem() {
Text('更新测试')
.margin({ bottom: 30 })
}

build() {
Column({ space: 10 }) {
Button('按钮1')
.onClick(() => {
this.isShowDelete = true;
})
.bindSheet($$this.isShowDelete, this.deleteItem(), {
height: SheetSize.FIT_CONTENT,
title: { title: '计划删除' },
onDisappear: () => {
this.isShowDelete = false;
},
maskColor: '#1a030303'
})
Button('按钮2')
.onClick(() => {
this.isShowEdit = true;
})
.bindSheet($$this.isShowEdit, this.updateItem(), {
height: SheetSize.FIT_CONTENT,
title: { title: '计划更新' },
onDisappear: () => {
this.isShowEdit = false;
},
maskColor: '#1a030303'
})
}
.height('100%')
.width('100%')
.margin({ top: 60 })
}
}

更多关于HarmonyOS 鸿蒙Next 同一个组件绑定两个半模态问题解析:前一个半模态拉起后迅速关闭,后一个半模态运转正常的原因探讨。代码示例如下的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


谢谢回复,自己了解如何修改,可以避免上述问题。如您所示,bindSheet放在不同的组件上就可以达到目的。我的困惑在于,为何挂在一个组件上就会出现这样的问题,底层原理上怎么解释,因为实际开发中,确实需要再同一组件绑定多个半模态。

没找到文档文档依据,我只猜一个情况,bindSheet 理论上只调用一次。 然后,我不太理解。为啥需要一个组件多个模态。一般情况bindSheet跟Component是强绑定的,也就是一定要确定视图挂到树上。一般情况更改boolean值的Component来绑定。 也就是有几个模态,有几个boolean,有几个Component.一对多的情况是不是有点少? 最后,如果真的没有Component对应的情况,文档里推荐 uiContext.openBindSheet.

在HarmonyOS鸿蒙Next系统中,同一个组件绑定两个半模态(SemiModal)时,如果前一个半模态拉起后迅速关闭,而后一个半模态运转正常,可能的原因如下:

  1. 生命周期冲突:前一个半模态拉起后,其生命周期管理可能未正确处理,导致迅速关闭。例如,在拉起第二个半模态前,如果前一个半模态的onDestroyonCancel方法被意外调用,会导致其关闭。

  2. 焦点管理:系统焦点管理可能存在问题。当第一个半模态关闭时,焦点可能立即转移到第二个半模态,使得第二个半模态能够正常显示。

  3. 资源抢占:两个半模态可能共享某些资源(如UI元素、内存等)。当第一个半模态关闭时,这些资源被释放,第二个半模态得以利用这些资源正常显示。

  4. 代码逻辑:代码逻辑中可能存在显式或隐式的关闭操作。例如,在第一个半模态的某个回调函数中,可能不小心触发了关闭操作。

针对此问题,建议检查并优化半模态的生命周期管理、焦点管理、资源使用及代码逻辑。确保在拉起第二个半模态前,第一个半模态已正确管理其生命周期和焦点。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部