Jetpack Compose:当 mutableStateOf 对象从 viewModel 更改时如何正确强制重组?

问题描述 投票:0回答:1

查看:

val viewModel = hiltViewModel<ActivityViewModel>()

Text("STATE: ${viewModel.state.activity?.inspectionInvitation?.state?.title}")

视图模型:

var state by mutableStateOf(ActivityScreenState())
    private set

    ....

suspend fun fetchActivity(id: String) {
    val resource = repository.fetchActivity(id)
    val activity = resource.data

    resource.errorMessage?.let {
        Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
    }

    state = state.copy(
        isLoading = false,
        activity = activity
    )
}

suspend fun accept(invitation: Invitation) {
    val tempActivity = state.activity
    tempActivity?.invitation?.state = InvitationState.ACCEPTED

    state = state.copy(
        activity = tempActivity
    )
}

活动屏幕状态:

data class ActivityScreenState(
    val isLoading: Boolean = true,
    val activity: Activity? = null,
)

data class Activity(
    val id: String,
    @Json(name = "inspection_invitation")
    val invitation: Invitation?,
)

data class Invitation(
    val id: String,
    var state: InvitationState
)

enum class ActivityState(val value: String) {
    @Json(name = "accepted")
    ACCEPTED("accepted"),

    @Json(name = "declined")
    DECLINED("declined");


    ...

}

我有一个 viewMode、ActivityScreenState 数据类,其中包含 Activity 数据类。当我更新 ActivityScreenState 内的 Activity 时,它不会重新组合我的可组合视图,但我知道如果我 Log.d 它它会发生变化..

我尝试过搜索,但找不到我做错了什么。还发现只有当我使 ActivityState 内的活动无效时它才会重新组合...

我做错了什么还是这是一个错误?我是 android 和 jetpack compose 的新手,所以我不知道在这里做什么......

android android-jetpack-compose android-jetpack-compose-material3
1个回答
0
投票

在 viewModel 中创建一个 stateFlow,它会像这样发出 ActivityScreenState,

private val _activityScreenState = MutableStateFlow(InitialActivityScreenState)
var activityScreenState = _activityScreenState.asStateFlow()

使用

_activityScreenState.tryEmit(NewActivityScreenState))

更新新的 ActivityScreenState,

在Composable视图中,你可以使用collectAsStateWithLifecycle()来收集最新更新的值

val viewModel = hiltViewModel<ActivityViewModel>()

Text("STATE: ${viewModel.activityScreenState.collectAsStateWithLifecycle().value.activity?.inspectionInvitation?.state?.title}")

您还可以使用collectAsState()代替collectAsStateWithLifecycle(),但它不具有生命周期感知能力。

© www.soinside.com 2019 - 2024. All rights reserved.