在Android開發者檔案中,在以下網址。https://developer.android.com/jetpack/compose/mental-model#recomposition
有一個可組合的函式,它被賦予以下內容:
@Composable
fun ClickCounter(clicks: Int, onClick: () -> Unit) {
Button(onClick = onClick) {
Text("我已經被點擊了$clicks次")
}
}
文中說,這產生了一個元素,它每次被點擊時都會更新其被點擊的次數。然而,看了一下,它似乎需要一個lambda函式來完成這個任務。
class MainActivity : ComponentActivity() {
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
設定內容 {
WorkTimerTheme {
對話(SampleData.conversationSample)
ClickCounter(clicks = 0) {
//Insert My Function Here
注釋//Insert My Function Here已經被我添加了。我猜想在這里面我必須放一個Lambda來更新composable的clicks值,但我不知道該放什么。有沒有人知道一個可以接受的寫法?
uj5u.com熱心網友回復:
你需要一個MutableState來觸發重組,以及remember{}來保持重組發生時的先前值。
我問了一個問題,我的問題包含對你問題的回答。
@Composable
fun MyScreenContent(names: List<String> = listOf("Android", "there")) {
val counterState = remember { mutableStateOf(0) }
Column(modifier = Modifier.fillMaxHeight() ) {
計數器(
count = counterState.value,
updateCount = { newCount ->
counterState.value = newCount
}
)
}
}
@Composable
fun Counter(count。Int, updateCount: (Int) -> Unit) {
按鈕(
onClick = { updateCount(count 1) },
) {
Text("我已經被點擊了$count次")
}
}
uj5u.com熱心網友回復:
非常感謝@Thracian 鏈接了一個類似的問題。由于我的答案是相關的,但略有不同,我想我應該發布我自己的答案。
正確的代碼如下:
class MainActivity : ComponentActivity(){
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
setContent {
val counterState = remember { mutableStateOf(0) }
WorkTimerTheme {
對話(SampleData.conversationSample)
ClickCounter(clicks = counterState.value) {
counterState.value
}
}
}
}
}
按照建議,我添加了一個mutableState值,它似乎記得上次"recomposition"時的東西的值,除非它被明確更新。如果一個 mutablestate 被顯式更新,這將觸發一次重新組合(正如 @Thracian 的問題的答案中所指出的)。
一個重新組合將重新繪制元素。
為了在重新組合時更新值,按鈕被點擊的次數必須存盤在 mutablestate 中,并在每次重新組合時傳遞給可組合函式。
使用可組合函式的 Lambda 引數來影響可變狀態,從而完成回圈,更新 mutablestate,然后用更新的值重新組合按鈕。
這就是counterState.value 的目的。
正如上面所建議的那樣,為了獲得更多相關資訊,請嘗試閱讀這個檔案。https://developer.android.com/jetpack/compose/state#viewmodel-state
該視頻與我們在這里討論的內容有關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/306699.html
標籤:
