ViewModel
とLiveData
を使用するときに問題が発生しました。ViewModelコンポーネントとLiveData Archコンポーネントを使用するのが初めてで、fragments
を使用して問題が発生し、オブザーバーがトリガーする画面を回転させます。 。私は移動しようとしました
すべてのフラグメントライフサイクルメソッドでviewModel = ViewModelProviders.of(this).get(MainViewModel::class.Java)
が成功しませんでした。
私のシナリオは本当に簡単なものです:
login(email, password)
を呼び出し、LiveDataオブジェクトの値を設定しますこの時点ですべてがOKです。しかし、画面を回転すると、ユーザーの操作なしでトーストが再び表示されます。
OnDestroyView()で何かをする必要がありますか?
前もって感謝します!
OK最後に問題と解決方法を見つけました。 LiveDataは単一のイベント用に設計されていません。そのため、修正または処理する方法がいくつかあります。この2つのリンクは私にとって役に立ちました。
JoseAlcérrecaのSingleLiveEventクラス
基本的に:
ViewModelで:
var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()
およびアクティビティまたはフラグメントで:
viewModel.eventLiveData.observe(this, EventObserver {
it?.let {
shortToast(it.message)
}
})
これがLiveDataとViewModelの仕組みです。同じLiveDataを使用して同じViewModelを取得し、ViewModelProviders.of(this).get(MainViewModel::class.Java)
を呼び出すと、LiveDataには以前の資格情報を持つUserなどの以前のオブジェクトがあります。 LiveDataのユーザーonPause()
またはonStop()
をリセットして、初期状態にリセットできます。
ViewModelとMainActivityを共有できれば、トーストをどのように呼び出すかわかりません。