为什么 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 的情况下使用可变状态不允许它在重组之间被记住,这使得它无用。