【问题标题】:Correct way to write a Modifier factory function编写修饰符工厂函数的正确方法
【发布时间】:2022-12-13 18:55:23
【问题描述】:

如果屏幕宽度为 600.dp 或更多或宽度的 80% 更小,我有以下方法将 LazyItemScope 中的某些内容的宽度设置为 300.dp。

@Composable
private fun LazyItemScope.widthModifier(configuration: Configuration = LocalConfiguration.current): Modifier =
    if (configuration.screenWidthDp >= 600) Modifier.width(300.dp) else Modifier.fillParentMaxWidth(.8f)

这给出了一个警告,即修改器工厂函数应该使用组合,所以我将其重写如下:

private fun LazyItemScope.widthModifier(): Modifier =
    Modifier.composed {
        val configuration: Configuration = LocalConfiguration.current
        if (configuration.screenWidthDp >= 600) Modifier.width(300.dp) else Modifier.fillParentMaxWidth(.8f)
    }

但是我仍然收到一条错误消息,指出 Modifier 扩展函数应该是 Modifier 上的扩展。但如果它是 Modifier 的扩展,则 fillParentMaxWidth 不可用。

有什么方法可以重写它以使其符合 lint 检查吗?

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    您可以将 lint 警告抑制为

    @SuppressLint("ModifierFactoryExtensionFunction")
    private fun LazyItemScope.widthModifier(): Modifier =
        Modifier.composed {
            val configuration: Configuration = LocalConfiguration.current
            if (configuration.screenWidthDp >= 600) Modifier.width(300.dp) else Modifier.fillParentMaxWidth(.8f)
        }
    

    并在 LazyItemScope 中使用它作为

    LazyColumn() {
        items(100){
            this.widthModifier()
        }
    }
    

    或将替代修饰符作为参数传递给修饰符扩展函数作为

    private fun Modifier.widthModifier2(modifier: Modifier): Modifier = composed {
            val configuration: Configuration = LocalConfiguration.current
            if (configuration.screenWidthDp >= 600) Modifier.width(300.dp) else modifier
        }
    

    并用作

    LazyColumn() {
        items(100) {
            Modifier.widthModifier2(Modifier.fillParentMaxWidth(.8f))
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多