查看:
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 的新手,所以我不知道在这里做什么......
在 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(),但它不具有生命周期感知能力。