當套接字事件給我資料但我的串列在套接字事件函式結束后沒有改變時,我嘗試更新我的 Jetpack UI
@HiltViewModel
class MyModelViewModel @Inject constructor(
private val repository: Repository,
private val socket: Socket
) : ViewModel() {
init {
getDataList()
}
var myModelList: MutableList<MyModel> = mutableListOf()
private fun getDataList() {
socket.connect()
socket.on("EVENT_NAME") { arg ->
myModelList=
Gson().fromJson(arg[0].toString(), Array<MyModel>::class.java)
.toList() as MutableList<MyModel>
}
}
}
我像這樣更新我的用戶界面
@SuppressLint("UnrememberedMutableState")
@Composable
fun TokenList(
viewModel: MyModelViewModel = hiltViewModel()
) {
val myModelListState by mutableStateOf(viewModel.myModelList)
uj5u.com熱心網友回復:
在 Compose 中,視圖只能通過可變狀態的更改來更新。你需要在你的視圖模型中使用它,而不是你的視圖。
如果您以后不需要從串列中添加/洗掉單個專案,您可以使用mutableStateOf:
var myModelList by mutableStateOf<List<MyModel>>(listOf())
//..
myModelList = Gson().fromJson(arg[0].toString(), Array<MyModel>::class.java).toList()
否則,您可以使用mutableStateListOf:
val myModelList = mutableStateListOf<MyModel>()
//..
myModelList.addAll(Gson().fromJson(arg[0].toString(), Array<MyModel>::class.java))
在這兩種情況下,你都不需要mutableStateOf在你的視圖中,你可以myModelList直接訪問。
此外,抑制"UnrememberedMutableState"是永遠不應該做的事情,因為使用不可變狀態remember不允許在重組之間記住它,這使得它毫無用處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430323.html
