为什么 Socket Io 如何用 mutableList 更新我的 UI Jetpack?
Why Socket Io how update my UI Jetpack with mutableList?
当套接字事件给我数据时,我尝试更新我的 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>
}
}
}
然后我就这样更新了我的 UI
@SuppressLint("UnrememberedMutableState")
@Composable
fun TokenList(
viewModel: MyModelViewModel = hiltViewModel()
) {
val myModelListState by mutableStateOf(viewModel.myModelList)
在 Compose 中,视图只能通过可变状态的更改来更新。您需要在视图模型而不是视图中使用它。
如果您以后不需要 add/remove 列表中的单个项目,您可以使用 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
的情况下使用可变状态不允许它在重组之间被记住,这使得它无用。
当套接字事件给我数据时,我尝试更新我的 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>
}
}
}
然后我就这样更新了我的 UI
@SuppressLint("UnrememberedMutableState")
@Composable
fun TokenList(
viewModel: MyModelViewModel = hiltViewModel()
) {
val myModelListState by mutableStateOf(viewModel.myModelList)
在 Compose 中,视图只能通过可变状态的更改来更新。您需要在视图模型而不是视图中使用它。
如果您以后不需要 add/remove 列表中的单个项目,您可以使用 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
的情况下使用可变状态不允许它在重组之间被记住,这使得它无用。