当片段被销毁时,Android ViewModel 不会被销毁

问题描述 投票:0回答:2

我在使用以下代码创建的片段中有视图模型:

 areaViewModel = ViewModelProvider(
        this, AreaViewModelFactory(AreaController.repository, currentPanelId, areaId)
    )[AreaViewModel::class.java]

ViewModel和ViewModelFactory的实现:

class AreaViewModelFactory (private val repository: AreaRepository): ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(AreaViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return AreaViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

class AreaViewModel@Inject constructor(private val repository: AreaRepository) : ViewModel(){

companion object {
    const val TAG: String = "AreaViewModel"
}

init {
    Log.i("AreaViewModel", "AreaViewModel created!")
}

private val _areaState = MutableStateFlow<Resource<Area>>(Resource.loading(null))
val areaState: StateFlow<Resource<Area>>
    get() = _areaState

fun getAreaById(panelId: Int, areaId: Int){
    _areaState.value = Resource.loading(null)
    viewModelScope.launch {
        repository.getAreaById(panelId, areaId) .catch { e ->
            _areaState.value = Resource.error(e.toString(), null)
        }
        .collect { it ->
            _areaState.value = Resource.success(it)
        }
    }
}

override fun onCleared() {
    Log.i("AreaViewModel", "AreaViewModel destroyed!")
    super.onCleared()
}
}

然后通过片段管理器删除片段:

private void removeControlFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragmentList = fragmentManager.getFragments();
    for(int i = 0; i < fragmentList.size(); i++) {
        if (fragmentList.get(i) instanceof ControlFragment) {
            fragmentManager.beginTransaction().remove(fragmentList.get(i)).commit();
        }
    }
}

我希望ViewModel的onCleared会在其对应的片段被销毁时被调用。然而,这不会发生。

请指出缺少或错误的地方?

android android-fragments android-viewmodel
2个回答
0
投票

您应该按照文档所述检查视图模型的生命周期。

视图模型生命周期


-1
投票

尝试

viewModelStore.clear()
这将清除ViewModelStore和所有关联的ViewModels。

例子:

class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels()

    override fun onDestroy() {
        super.onDestroy()
        viewModelStore.clear()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.