Boolean 在 kotlin 中传递后变为 false?

问题描述 投票:0回答:1

我已经开始涉足 Kotlin,因为我对开始制作 Android 应用程序很感兴趣。 虽然我在尝试将

isRecording
布尔值传递给
TouchRecorder
时遇到问题,但它总是无缘无故地变成 false,有什么帮助吗?

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MaterialTheme {
                AppContent(this)
            }
        }
    }
}

@Composable
fun AppContent(activity: ComponentActivity) {
    var isRecording by remember { mutableStateOf(false) }
    val recordedEvents by remember { derivedStateOf { mutableListOf<PointerInputChange>() } }

    Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
        Column {
            Button(onClick = { isRecording = true }) {
                Text("Record")
            }
            Button(onClick = { isRecording = false }) {
                Text("Stop Recording")
            }
            Button(onClick = { recordedEvents.clear() }) {
                Text("Clear")
            }
            Button(onClick = { playRecordedEvents(activity, recordedEvents) }) {
                Text("Play")
            }
            Log.d("AppContent", "Recording: $isRecording, Events: ${recordedEvents.size}")
            TouchRecorder(isRecording = isRecording) { change ->
                recordedEvents.add(change)
            }
        }
    }
}

@Composable
fun TouchRecorder(
    isRecording: Boolean,
    onTouchEvent: (PointerInputChange) -> Unit
) {
    Log.d("TouchRecorder", "isRecording = $isRecording")
    Surface(modifier = Modifier
        .fillMaxSize()
        .pointerInput(Unit) {
            detectDragGestures { change, _ ->
                Log.d("TouchRecorder", "isRecording: $isRecording, drag: $change")
                if (isRecording) {
                    onTouchEvent(change)
                    change.consume()
                }
            }
        }
    ) {
    }
}

在尝试诊断问题时,我添加了代码中看到的日志,但不知道为什么会发生。

android kotlin android-jetpack-compose
1个回答
0
投票

问题出在

pointerInput
修饰符上,您检测到
isRecording
为假。该修饰符的工作方式与
remember
类似,只有在 key 参数发生更改时才会重新执行。

第一次执行该修饰符时,在应用程序启动时,

isRecording
将为 false。您提供了
Unit
作为 key 参数,因此只有在更改时才会更新。但
Unit
无法更改,因此无论该修改器周围发生什么,修改器本身都不会受到影响。将
isRecording
设置为 true 可以按预期工作,但
pointerInput
仍将使用旧的 lambda,其中为 false。

要解决此问题,只需将

Unit
替换为
isRecording

© www.soinside.com 2019 - 2024. All rights reserved.