我有這樣的代碼:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
TestsTheme {
var myvalue = remember{ mutableStateOf(4)}
Row() {
CustomText(myvalue = myvalue)
CustomButton(myvalue = myvalue)
}
}
}
}
}
@Composable
fun CustomButton(myvalue: MutableState<Int>) {
Button(onClick = {myvalue.value }) {
}
}
@Composable
fun CustomText(myvalue: MutableState<Int>) {
Text("${myvalue.value}")
}
當我單擊 CustomButton 時,CustomText 會重新組合并更改它的值(這沒關系),但是如果我將 myvalue 替換為某個類的物件,它就不起作用
如果 myvalue 現在是 TestClass 的一個實體并且它在下面的代碼中發生了變化,我該如何進行 CustomText 重組?
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
TestsTheme {
var myvalue = remember{ mutableStateOf(TestClass(4))}
Row() {
CustomText(myvalue = myvalue)
CustomButton(myvalue = myvalue)
}
}
}
}
}
@Composable
fun CustomButton(myvalue: MutableState<TestClass>) {
Button(onClick = {myvalue.value.a }) {
}
}
@Composable
fun CustomText(myvalue: MutableState<TestClass>) {
Text("${myvalue.value.a}")
}
data class TestClass(var a: Int) {
}
uj5u.com熱心網友回復:
Compose 只能理解,如果你設定了一個State物件的值,它就應該重新組合。在您的示例myvalue.value 中,它實際上只是 的縮寫myvalue.value = myvalue.value.inc(),因此觸發重組的是呼叫state.valuesetter。
如果你只是改變狀態持有的物件的一個??屬性,你就不會呼叫 setter,也不會發生重組。
所以你有兩個選擇來解決這個問題:
- 使
TestClass不可變并State使用新物件更新
data class TestClass(val a: Int) { // << changed var to val
}
@Composable
fun CustomButton(myvalue: MutableState<TestClass>) {
Button(onClick = {
val current = myvalue.value
myvalue.value = current.copy(a = current.a 1)
}) {
}
}
這不是很好閱讀,但不需要TestClass包含任何特定于撰寫的代碼。
- 做
TestClass一個國家持有人
class TestClass(a: Int) {
var a by mutableStateOf(a)
}
@Composable
fun Parent(){
val myvalue = remember{ TestClass(4) } // no mutableStateOf, state is managed inside the object
CustomButton(myvalue = myvalue)
}
@Composable
fun CustomButton(myvalue: TestClass) {
Button(onClick = { myvalue.a }) {
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442802.html
標籤:安卓 android-jetpack-compose 机器人喷气背包
上一篇:如何訪問物件json陣列中的一個元素并將此資料系結在Ionic6/Chartjs中的X軸上?
下一篇:獲取所有別名的串列并與名稱聯合
