web-dev-qa-db-ja.com

Android画面の回転後にArch Components ViewModelおよびLiveDataトリガー

ViewModelLiveDataを使用するときに問題が発生しました。ViewModelコンポーネントとLiveData Archコンポーネントを使用するのが初めてで、fragmentsを使用して問題が発生し、オブザーバーがトリガーする画面を回転させます。 。私は移動しようとしました

すべてのフラグメントライフサイクルメソッドでviewModel = ViewModelProviders.of(this).get(MainViewModel::class.Java)が成功しませんでした。

私のシナリオは本当に簡単なものです:

  1. メールとパスワードを使用したログイン画面
  2. ユーザーが「ログイン」ボタンをクリックする
  3. ビューモデルはlogin(email, password)を呼び出し、LiveDataオブジェクトの値を設定します
  4. とりあえず簡単にトーストを見せて

この時点ですべてがOKです。しかし、画面を回転すると、ユーザーの操作なしでトーストが再び表示されます。

OnDestroyView()で何かをする必要がありますか?

前もって感謝します!

12
Nicolas Jafelle

OK最後に問題と解決方法を見つけました。 LiveDataは単一のイベント用に設計されていません。そのため、修正または処理する方法がいくつかあります。この2つのリンクは私にとって役に立ちました。

この問題を扱ったホセ・アルセレカの投稿

JoseAlcérrecaのEventObserver

JoseAlcérrecaのSingleLiveEventクラス

基本的に:

ViewModelで:

var eventLiveData: MutableLiveData<Event<ErrorResponse>> = MutableLiveData()

およびアクティビティまたはフラグメントで:

viewModel.eventLiveData.observe(this, EventObserver {
     it?.let {
          shortToast(it.message)
     }
})
9
Nicolas Jafelle

これがLiveDataとViewModelの仕組みです。同じLiveDataを使用して同じViewModelを取得し、ViewModelProviders.of(this).get(MainViewModel::class.Java)を呼び出すと、LiveDataには以前の資格情報を持つUserなどの以前のオブジェクトがあります。 LiveDataのユーザーonPause()またはonStop()をリセットして、初期状態にリセットできます。

ViewModelとMainActivityを共有できれば、トーストをどのように呼び出すかわかりません。

5
Thracian