android-fragments 在视图模型中使用init{}失败

mwngjboj  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(125)

我正在使用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 {}一样。
知道吗?谢谢

b5lpy0ml

b5lpy0ml1#

init块或初始化程序块在主构造函数之后立即执行,并且在Object的生命周期中仅被调用一次,基本上是构造函数的第一行。
当您从UpdateUserProfile按下back时,它会弹出返回堆栈并转到您的ProfileFragment,但ViewModel示例保持不变,因此不会调用init
您可以将数据传回ProfileFragment以更新其UI。有几种方法可以完成此操作。您可以使用FragmentResultAPI或使用SavedStateHandle

相关问题