我正在使用ViewModel和init{}
块,如下所示:
class AccountViewModel @Inject constructor(
private val userProfileUseCases: UserProfileUseCases,
) : ViewModel() {
private val _uIState = MutableStateFlow<UIState>(UIState.Empty)
val uIState: StateFlow<UIState> = _uIState
init {
viewModelScope.launch(Dispatchers.IO) {
_uIState.value = UIState.Loading
getUserProfile()
}
}
suspend fun getUserProfile() = userProfileUseCases.getUserProfile().collect { result ->
when (result) {
is Success -> {
result.data?.let { userProfile ->
_uIState.value = UIState.UpdateUserProfile(userProfile)
}
}
然后片段捕获UpdateUserProfile
并更新UI。为了在应用中导航,我使用了导航组件。片段显示用户的配置文件,但为了编辑/修改它,我使用了另一个片段,并使用findNavController().safeNavigation
导航到它。单击打开新片段并执行我想要的操作。
在这个新的片段中,我可以回到调用者,也就是回到用户配置文件片段。
它在工作,但是配置文件是空的,就像在back操作中不再调用init {}
一样。
知道吗?谢谢
1条答案
按热度按时间b5lpy0ml1#
init
块或初始化程序块在主构造函数之后立即执行,并且在Object的生命周期中仅被调用一次,基本上是构造函数的第一行。当您从
UpdateUserProfile
按下back时,它会弹出返回堆栈并转到您的ProfileFragment
,但ViewModel示例保持不变,因此不会调用init
。您可以将数据传回
ProfileFragment
以更新其UI。有几种方法可以完成此操作。您可以使用FragmentResultAPI或使用SavedStateHandle