【问题标题】:Slider in Android Jetpack ComposeAndroid Jetpack Compose 中的滑块
【发布时间】:2021-07-30 18:06:25
【问题描述】:
  • 你好 我使用 jetpack compose 创建了一个随机生成一系列数字的程序。 并将它们返回到文本视图。一世 也使用了一个滑块来设置这个范围,但是当我改变滑块时, 数字不断变化,仿佛陷入了一个循环。是什么 这个问题的原因是什么?我该怎么办? 谢谢

这是我的 RandomGenerator 类 ->

class RandomGenerator (
    
            private val stringSource: String,
            private val outputLength: Long = 4,
            private val startFrom: Int,
            private val to: Int) {
    
        @RequiresApi(Build.VERSION_CODES.N)
        fun generate(): String  {
    
            return Random()
                    .ints(outputLength, startFrom, to)
                    .asSequence()
                    .map(stringSource::get)
                    .joinToString("")
        }
    }

这是我返回 Int 的 Slider

@Composable
fun slider() : Int
{
    var sliderPosition by remember { mutableStateOf(1f) }

    Slider(
            modifier = Modifier.padding(10.dp).size(180.dp),

            value = sliderPosition,
            valueRange = 1f..10f,
            onValueChange = {sliderPosition = it}
    )

    return sliderPosition.roundToInt()
}

还有……

 setContent {

        var msg by rememberSaveable { mutableStateOf("") }

        Column(modifier = Modifier
            .fillMaxSize()
            .padding(10.dp)) {

            val len = slider()

            val result = RandomGenerator(numbers, 10, 0, len).generate()

            msg = resutl

            Text(text = msg)

        }
    }

【问题讨论】:

  • 用返回改变状态是行不通的,你想传递一个 lambda 来“通知”改变。
  • 怎么样?请你解释一下好吗?
  • 看看官方的示例和指南来编写,你似乎错过了 Compose 概念如何工作的一些基础知识。

标签: android-jetpack-compose


【解决方案1】:

哦,问题是您正在为作为状态持有者的“msg”分配一个值,因此触发了重组。这是一个无限循环。

【讨论】:

  • 我删除了那个赋值,问题解决了,但是如果我还想保持文本视图状态,我该怎么办?
  • 需要维护的任何(重要)状态都存储在视图模型中。如果有多个文本视图,请创建一个不可变列表并将其存储在视图模型中或任何可能更适合您的用例的地方
  • 嘿,有一组很棒的 compose 代码实验室。我强烈建议带走它们。只要在网上搜索“Jetpack Compose Pathways”,就可以在官网找到。他们将加强您对撰写的理解
猜你喜欢
  • 2022-01-22
  • 2022-07-29
  • 1970-01-01
  • 2023-01-20
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多