搜索文档
布局循环依赖是指在组件布局计算过程中出现的相互依赖关系,导致布局引擎无法确定最终尺寸的情况。这通常发生在以下场景:
让我们通过具体示例来理解这些情况:
1// 错误示例:父子循环依赖 2ParentView = <View> { 3 walk: { 4 width: Fill, 5 height: Fit // 父组件高度依赖子组件 6 }, 7 layout: { 8 flow: Down 9 }, 10 11 <ChildView> { 12 walk: { 13 width: Fill, 14 height: Percentage(0.5) // 子组件高度依赖父组件 15 } 16 } 17}
在这个例子中:
Fit
图示父子循环依赖:
1┌─ Parent (height: Fit) ─┐ 2│ ? │ 3│ ┌─ Child ─┐ │ 4│ │ height:│ │ 5│ │ 50% │ ? │ 6│ │ of ? │ │ 7│ └─────────┘ │ 8└────────────────────────┘
1// 错误示例:兄弟组件循环依赖 2Container = <View> { 3 layout: { 4 flow: Right 5 }, 6 7 <LeftView> { 8 walk: { 9 width: Fill, // 左侧组件填充剩余空间 10 height: Fit 11 } 12 } 13 14 <RightView> { 15 walk: { 16 width: Fit, // 右侧组件宽度自适应 17 height: Fit 18 }, 19 layout: { 20 flow: Down 21 } 22 } 23}
这个例子中:
最安全的方式是为关键尺寸提供明确的约束:
1// 正确示例:明确尺寸约束 2ParentView = <View> { 3 walk: { 4 width: Fill, 5 height: Fixed(500) // 明确父组件高度 6 }, 7 8 <ChildView> { 9 walk: { 10 width: Fill, 11 height: Percentage(0.5) // 现在可以正确计算 12 } 13 } 14}
1Container = <View> { 2 layout: { 3 flow: Right 4 }, 5 6 <LeftView> { 7 walk: { 8 width: Percentage(0.7), // 固定比例 9 height: Fit 10 } 11 } 12 13 <RightView> { 14 walk: { 15 width: Fixed(200), // 固定宽度 16 height: Fit 17 } 18 } 19}
建立正确的布局方向可以避免许多循环依赖:
1// 推荐的布局方向 2GoodLayout = <View> { 3 layout: { 4 flow: Down // 垂直布局更容易推导尺寸 5 }, 6 7 <Header> { 8 walk: { 9 width: Fill, 10 height: Fixed(60) // 固定高度头部 11 } 12 } 13 14 <Content> { 15 walk: { 16 width: Fill, 17 height: Fill // 填充剩余空间 18 } 19 } 20 21 <Footer> { 22 walk: { 23 width: Fill, 24 height: Fit // 底部高度自适应 25 } 26 } 27}
当布局引擎检测到潜在的循环依赖时,会采取以下策略: