如何在 Jetpack Compose 中制作文本以输出所有 Live.postValue 数据而不丢失旧行

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

文本仅显示一行更新的实时数据。如何确保文本不被覆盖,但添加了实时数据行?

            var myLive = MutableLiveData<String>()
            
            setContent {
            val text: String? by myLive.observeAsState()
            text?.let { viewModel.ontextfieldvalChange(it) }

                        SelectionContainer() {
                            Text(
                                gameUiState.textfieldval,
                                modifier = Modifier
                                    .background(Color.Black)
                                    .height(150.dp)
                                    .verticalScroll(scroll)
                                    .border(BorderStroke(1.dp, Color.Gray)),
                                color = Color.Green
                            )
                        }
                      }

            apiWithoutCompose()
                 {myLive.postValue(link.absUrl("href")}
android kotlin android-jetpack-compose
1个回答
0
投票

您甚至不应该首先使用 LiveData。对于 Kotlin 和 Compose,最好使用 Flows

也就是说,所有这些都应该转移到视图模型中。然后它可能看起来像这样:

class MyViewModel : ViewModel() {
    private val _gameUiState = MutableStateFlow(GameUiState(""))
    val gameUiState: StateFlow<GameUiState> = _gameUiState.asStateFlow()

    fun ontextfieldvalChange(text: String) {
        _gameUiState.update {
            it.copy(textfieldval = it.textfieldval + "\n" + text)
        }
    }
}

在您的撰写代码中,您可以使用以下命令检索 gameUiState:

val gameUiState by viewModel.gameUiState.collectAsStateWithLifecycle()

为此,您需要 gradle 依赖项

androidx.lifecycle:lifecycle-runtime-compose

您不再需要
text
变量。

现在

apiWithoutCompose
可以调用视图模型的
ontextfieldvalChange
:

apiWithoutCompose {
    viewModel.ontextfieldvalChange(link.absUrl("href"))
}

有点不清楚

apiWithoutCompose
是什么以及它是从哪里调用的,但看起来它甚至不应该位于视图模型之外。它甚至可能应该位于某个更深的层,例如存储库中

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