Как отсоединить viewModel от активности, когда она разрушается - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть моя miewModel, которую я вставляю в свой фрагмент броска ViewModelProviders.of(activity, viewModelFactory).get(MyViewModel::class.java).

Это нормально работает при первом создании фрагмента, но если я закрою свой фрагмент, я получу ошибку "layout must not be null", которая указывает на некоторые из моих макетов, которые я использую в своемфрагмент.

Как я понял, это происходит потому, что привязка данных все еще имеет некоторые ссылки на мой фрагмент.Так как же это сделать?

class MyFragment: Fragment(), Injectable {
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory 

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        activity?.window?.changeStatusBarColor(this.requireContext(), R.color.yellow_status_bar)

        val binding: MyLayoutBinding = DataBindingUtil.inflate(inflater, R.layout.my_layout, container, false)
        binding.viewModel = viewModel

        viewModel.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
            override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
}
}

ViewModelModule:

@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
internal abstract fun bindMyViewModel(myViewModel: MyViewModel): ViewModel

1 Ответ

0 голосов
/ 11 февраля 2019

Чтобы связать ViewModel жизненный цикл с фрагментом, вам нужно позвонить:

val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]

вместо:

val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]

Не забудьте освободить ресурсы в ViewModel.onCleared()

...