HarmonyOS鸿蒙Next中Sheet组件在多个bindSheet链式调用时,首个点击无响应,需要先触发其他Sheet才能显示
HarmonyOS鸿蒙Next中Sheet组件在多个bindSheet链式调用时,首个点击无响应,需要先触发其他Sheet才能显示 【问题描述】:我在个人中心页面中使用3个bindSheet链式绑定不同对话框,首次点击"任务一"或"任务二"无反应,必须先点击"任务三"后再点击空白区域,其他两个Sheet才能逐个显示。已尝试aboutToAppear预初始化和点击事件延迟,问题依然存在
【问题现象】:

更多关于HarmonyOS鸿蒙Next中Sheet组件在多个bindSheet链式调用时,首个点击无响应,需要先触发其他Sheet才能显示的实战教程也可以访问 https://www.itying.com/category-93-b0.html
使用bindSheet半模态时,如果在同一组件绑定三个bindSheet调用,会使前两个半模态被覆盖,无法即时响应。需要分开单独的组件各自绑定,或者如果使用foreach展示列表,可以封装一下,在点击事件中写一个判断展示不同内容
@Entry
@Component
struct TestPage {
@State CursNumber: string[] = ['任务一', '任务二', '任务三']; // 添加数据源
@State index: number = -1; // 添加边框宽度状态变量
@State isShow: boolean = false;
@State buttonText: string = '';
@State inputText: string = '';
@State contentText: string = '';
@Builder
textButtonBuilder(text: string) {
Column() {
Button(text)
.margin(10)
.fontSize(20)
}
}
@Builder
textInputBuilder(text: string) {
Column() {
TextInput({ placeholder: text })
.margin(10)
.fontSize(20)
}
}
@Builder
textBuilder(text: string) {
Column() {
Text(text)
.margin(10)
.fontSize(20)
}
}
@Builder
AllBuilder() {
Column() {
if (this.index === 0) {
this.textInputBuilder(this.inputText)
} else if (this.index === 1) {
this.textButtonBuilder(this.buttonText)
} else if (this.index === 2) {
this.textBuilder(this.contentText)
}
}
}
build() {
Column() {
ForEach(this.CursNumber, (it: string, index: number) => {
Text(it)
.fontSize(18)
.width('100%')
.height(60)
.backgroundColor(Color.Grey)
.fontColor(Color.Black)
.textAlign(TextAlign.Center)
.margin(10)
.border({ width: this.index === index ? 2 : 0 })
.borderRadius(10)
.borderColor('rgba(94, 223, 246, 1.00)')
.onClick(() => {
this.isShow = true;
this.index = index; // 设置边框
switch (index) {
case 0:
this.inputText = '任务一';
break;
case 1:
this.buttonText = '任务二';
break;
case 2:
this.contentText = '任务三';
break;
}
})
}, (it: string) => it)
}
.width('100%')
.margin({ top: 20 })
.padding(10)
.justifyContent(FlexAlign.Center)
.bindSheet($$this.isShow, this.AllBuilder(), {
height: 300,
backgroundColor: Color.White,
blurStyle: BlurStyle.Thick,
showClose: true,
title: { title: "title", subtitle: "subtitle" },
preferType: SheetType.CENTER,
onWillDismiss: ((dismissSheetAction: DismissSheetAction) => {
if (dismissSheetAction.reason == DismissReason.SLIDE_DOWN ||
dismissSheetAction.reason == DismissReason.CLOSE_BUTTON) {
dismissSheetAction.dismiss(); //注册dismiss行为
}
}),
onWillSpringBackWhenDismiss: ((SpringBackAction: SpringBackAction) => {
SpringBackAction.springBack();
}),
})
}
}
更多关于HarmonyOS鸿蒙Next中Sheet组件在多个bindSheet链式调用时,首个点击无响应,需要先触发其他Sheet才能显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
弹窗绑在一起冲突了,你好小伙伴可以这样玩儿

export enum BuilderConstEnum {
BUILDER_ONE = 'BuilderOne',
BUILDER_TWO = 'BuilderTwo',
BUILDER_THREE = 'BuilderThree',
}
@Builder
function
myBuilder1() {
Column() {
Button(`任务一`)
.margin(10)
.fontSize(20)
}
.width('100%')
}
@Builder
function
myBuilder2() {
Column() {
Button(`任务二`)
.margin(10)
.fontSize(20)
}
.width('100%')
}
@Builder
function
myBuilder3() {
Column() {
Button(`任务三`)
.margin(10)
.fontSize(20)
}
.width('100%')
}
export const builderArr: Map<string, WrappedBuilder<[]>> = new Map()
builderArr.set(BuilderConstEnum.BUILDER_ONE, wrapBuilder(myBuilder1))
builderArr.set(BuilderConstEnum.BUILDER_TWO, wrapBuilder(myBuilder2))
builderArr.set(BuilderConstEnum.BUILDER_THREE, wrapBuilder(myBuilder3))
@Component
export struct SheetTransitionExample {
@State isShow: boolean = false;
@State bindSheetEnum: Record<number , string> = {
1: 'BuilderOne',
2: 'BuilderTwo',
3: 'BuilderThree',
}
@State curIndex: number = 1
build() {
Column() {
Column() {
ForEach([1, 2, 3], (item: number) => {
Button(`任务${item}`)
.onClick(() => {
this.isShow = true;
this.curIndex = item
})
.fontSize(20)
.margin(10)
.id(item.toString())
.bindSheet(this.isShow && this.curIndex === item, builderArr.get(this.bindSheetEnum[item])?.builder(), {
detents: [SheetSize.MEDIUM, SheetSize.LARGE, 200],
blurStyle: BlurStyle.Thick,
showClose: true,
title: { title: "title", subtitle: "subtitle" },
onWillDismiss: ((dismissSheetAction: DismissSheetAction) => {
if (dismissSheetAction.reason == DismissReason.SLIDE_DOWN) {
dismissSheetAction.dismiss(); //注册dismiss行为
}
this.isShow = false
}),
})
})
}
.justifyContent(FlexAlign.Start)
.width('100%')
.height('100%')
}
}
}
在HarmonyOS Next中,多个bindSheet链式调用时,首个点击无响应的问题,是由于Sheet组件的状态管理机制导致的。当多个Sheet通过链式调用绑定到同一触发源时,首个Sheet的显示状态可能未正确初始化。解决方法是使用独立的@State变量分别控制每个Sheet的显示状态,避免状态依赖。确保每个Sheet的显示控制逻辑相互独立,即可解决该问题。
这个问题通常是由于Sheet组件的状态管理或绑定时机导致的。在链式调用多个bindSheet时,首个Sheet可能因为状态未正确初始化而无法响应。
核心原因:
- 状态同步问题:多个Sheet绑定可能存在依赖关系,首个Sheet的状态未就绪。
- 事件冒泡/捕获冲突:点击事件可能被其他元素拦截或未正确触发。
解决方案:
- 使用Promise或setTimeout确保初始化顺序:
// 在点击事件中确保前序Sheet已就绪
onClickFirst() {
setTimeout(() => {
this.sheet1Controller.open();
}, 0);
}
- 检查Sheet的绑定顺序和条件:
- 确保所有Sheet都在组件初始化时完成绑定。
- 避免在条件渲染中动态绑定Sheet。
- 使用@State管理显示状态:
[@State](/user/State) isSheet1Show: boolean = false;
// 通过状态控制显示
onClickFirst() {
this.isSheet1Show = true;
}
- 检查事件传递:
如果问题仍存在,建议检查HarmonyOS Next的API版本是否最新,并确认Sheet组件的使用是否符合当前版本的规范。

