相关疑难解决方法(0)

Jetpack Compose 范围/智能重组

我正在做实验来理解重组和智能重组并制作了一个样本

\n

在此输入图像描述

\n

抱歉,颜色是用 Random.nextIn() 生成的,以便在视觉上观察重组,设置颜色对重组没有影响,也尝试不更改颜色。

\n

gif的内容由三部分组成

\n

样品1

\n
@Composable\nprivate fun Sample1() {\n\n    Column(\n        modifier = Modifier\n            .background(getRandomColor())\n            .fillMaxWidth()\n            .padding(4.dp)\n    ) {\n        var counter by remember { mutableStateOf(0) }\n\n\n        Text("Sample1", color = getRandomColor())\n\n        Button(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(vertical = 4.dp),\n            colors = ButtonDefaults.buttonColors(backgroundColor = getRandomColor()),\n            onClick = {\n                counter++\n            }) {\n            Text("Counter: $counter", color = getRandomColor())\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在这里没有问题,因为智能组合按预期工作,Text最重要的是不读取更改,counter因此重组仅发生在Textinside Button

\n

样品2

\n
@Composable\nprivate fun Sample2() {\n    Column(\n        modifier …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose compose-recomposition

16
推荐指数
1
解决办法
7253
查看次数

为什么有时没有记住的 mutableStateOf 也能工作?

我一直在使用 Jetpack Compose Desktop。我注意到一些我真的不明白的事情:

import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application

@Composable
@Preview
fun App() {
    var text by mutableStateOf("Hello, World!")

    MaterialTheme {
        TextField(text, onValueChange = { text = it })
        Button(onClick = {
            text = "Hello, Desktop!"
        }) {
            Text(text)
        }
    }
}

fun main() = application {
    Window(onCloseRequest = ::exitApplication) {
        App()
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我可以更改 中的文本TextField?我认为在每次重组时,可变状态都会使用初始值重新实例化:所以Text应该无法更改

import androidx.compose.desktop.ui.tooling.preview.Preview
import …
Run Code Online (Sandbox Code Playgroud)

kotlin android-jetpack-compose mutablestateof

11
推荐指数
1
解决办法
3255
查看次数

Android Jetpack Compose - 每次文本字段值更改时都会重新组合可组合函数

我用来TextField获取用户输入并使用 stateflow 来处理视图模型中的文本状态/值。

问题是每次TextField的值发生变化时,HomeContent()函数都会被重新组合。
布局检查器输出图像 我的问题是,仅仅HomeContent()因为值发生变化就可以重构整个函数TextField,还是有办法避免函数重构?

视图模型

class MyViewModel() : ViewModel() {
    private val _nameFlow = MutableStateFlow("")
    val nameFlow = _nameFlow.asStateFlow()

    fun updateName(name: String) {
        _nameFlow.value = name
    }
}
Run Code Online (Sandbox Code Playgroud)

主要活动

class MainActivity : ComponentActivity() {
    private val myViewModel by viewModels<MyViewModel>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            AppArchitectureTheme {
                HelloScreen(myViewModel)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

主屏幕

@Composable
fun HelloScreen(viewModel: MyViewModel) {
    val name = viewModel.nameFlow.collectAsState()
    HelloContent(
        provideName = { …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose android-compose-textfield

6
推荐指数
1
解决办法
3795
查看次数