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每次当我转到上一个片段时,我认为应该清除范围,就会调用视图模型的方法。我尝试捕获异常,但没有抛出异常。我尝试调试,但异步调用的调试点都没有被命中。
检查如何创建此视图模型,以及何时更重要。如果您使用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)
| 归档时间: |
|
| 查看次数: |
2716 次 |
| 最近记录: |