viewModelScope.launch 第二次不起作用

Aks*_*hah 13 android kotlin android-navigation android-viewmodel kotlin-coroutines

我有 2 个片段,FragmentA 包含星球大战角色列表,而 FragmentB 包含该角色的详细信息。我在片段中使用 viewModelScope.launch 来获取角色的详细信息。下面是我的视图模型

@HiltViewModel
class DetailsViewModel @Inject constructor(
    private val getSpecieDetailsUseCase: GetSpecieDetailsUseCase,
    private val getFilmDetailsUseCase: GetFilmDetailsUseCase,
    private val getPlanetDetailsUseCase: GetPlanetDetailsUseCase,
    private val mapper: CharacterDetailMapper
) : ViewModel() {

    var characterDetailsModel = MutableLiveData<CharacterDetailsModel?>()

    fun init(infoModel: CharacterInfoModel?) {
        characterDetailsModel.postValue(null)
        try {
            viewModelScope.launch {
                infoModel?.let {
                    val specieResponse = async(context = Dispatchers.IO) {
                        it.specieIdList?.map {
                            getSpecieDetailsUseCase.executeUseCase(
                                GetSpecieDetailsUseCase.GetSpecieDetailsRequest(
                                    it
                                )
                            )
                        }
                    }
                    val filmResponse = async(context = Dispatchers.IO) {
                        it.filmsIdList?.map {
                            getFilmDetailsUseCase.executeUseCase(
                                GetFilmDetailsUseCase.GetFilmDetailsRequest(
                                    it
                                )
                            )
                        }
                    }
                    val planetResponse = it.homeworldId?.let {
                        getPlanetDetailsUseCase.executeUseCase(
                            GetPlanetDetailsUseCase.GetPlanetDetailsRequest(
                                it
                            )
                        )
                    }
                    characterDetailsModel.postValue(
                        mapper.toModel(
                            name = it.name.toString(),
                            birth_year = it.birth_year.toString(),
                            height = it.height.toString(),
                            specieDetailsResponse = specieResponse.await(),
                            filmDetailsResponse = filmResponse.await(),
                            planetDetailsResponse = planetResponse
                        )
                    )
                }
            }
        } catch (exception: Exception) {
            exception.stackTrace
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

上面的viewModelScope.launch内容在第一次点击时工作得很好,但在第二次点击时就不起作用了(即返回到上一个片段并返回到详细信息片段)。函数中收到的数据init也是更新的数据,但是我的异步调用似乎都没有第二次工作。onCleared每次当我转到上一个片段时,我认为应该清除范围,就会调用视图模型的方法。我尝试捕获异常,但没有抛出异常。我尝试调试,但异步调用的调试点都没有被命中。

w20*_*201 3

检查如何创建此视图模型,以及何时更重要。如果您使用by viewModels() LAZY delegate,请检查它何时首次初始化。viewModels()用作thisviewModelStoreOwner。在 99% 的情况下,当launch不起作用时this将指向主机 Activity。解决方案很简单 - 创建您自己的 lamda,它将返回 Fragment 的正确 viewModelStoreOwner 或使用旧样式的 viewModel 初始化。

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(TextClassifiedViewModel::class.java)
    }
Run Code Online (Sandbox Code Playgroud)