修改器取决于 Jetpack Compose 中其他修改器的值?

Posted

技术标签:

【中文标题】修改器取决于 Jetpack Compose 中其他修改器的值?【英文标题】:Modifiers depending on other modifier's values in Jetpack Compose? 【发布时间】:2021-09-23 06:20:40 【问题描述】:

如何创建依赖于其他一些修饰符值的新修饰符?举例来说,我想让子组件的高度为从父组件传入的高度的一半加上一些常数(因此无法使用 fillMaxHeight(fraction: Float))。

@Composable
fun View() 
   MyComposable(modifier = Modifier.size(40.dp))


@Composable
fun MyComposable(
  modifier: Modifier          // Assuming this modifier contains a size
) 
  Box(modifier)              // Setting the the size from the passed in modifier
    val childHeightModifier = Modifier.height(???) // <-- Wanted to be some specific value depending on parent size
    
    Box(childHeightModifier) 
       ...
    
  

【问题讨论】:

另一种看待这个问题的方式是询问;如何制作只对传入修饰符的某些特定值感兴趣的新修饰符?假设传入的修饰符具有 .background(..).size(40.dp) 并且我只想将此修饰符的大小值传递给孩子。 不行:***.com/q/68725596/15880865 【参考方案1】:

对于这个特定的用例,您可以使用BoxWithConstraints,它提供了父级对其子级施加的约束:

@Composable
fun View() 
   MyComposable(modifier = Modifier.size(40.dp))


@Composable
fun MyComposable(modifier: Modifier) 
  BoxWithConstraints(modifier)  // this: BoxWithConstraintsScope
    val childHeightModifier = Modifier.height(maxHeight * 0.5f)
    Box(childHeightModifier) 
       ...
    
  

至于Modifiers 之间的通信,有一个ModifierLocal 系统in the works,可以做到这一点。

【讨论】:

谢谢!很高兴知道 Compose 团队也考虑了这个案例,并且正在提供一些支持!我认为这在一些自定义绘图情况下是必要的,我们需要更多地控制精确尺寸。

以上是关于修改器取决于 Jetpack Compose 中其他修改器的值?的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Compose ScrollableTabRow 如何调整最小宽度

Jetpack Compose 从入门到入门

Jetpack Compose 从入门到入门

Jetpack Compose 从入门到入门

Jetpack Compose 从入门到入门

Kotlin jetpack compose Tab的渲染 AnimatedVisibility的使用