タグ付けされた質問 「android-viewmodel」

3
AndroidViewModelとViewModel
Androidアーキテクチャコンポーネントライブラリの導入に伴い、AndroidViewModelおよびを含むいくつかの新しいクラスが導入されましたViewModel。しかし、これら2つのクラスの違いを理解するのに苦労しています。ドキュメントは簡潔に説明しAndroidViewModel、次のように: アプリケーションコンテキスト対応 ViewModel 簡潔に感謝しますが、これは正確に何を意味していますか?いつ使用AndroidViewModelするViewModelか、その逆かを選択する必要があるのはいつですか?

21
ViewModelProvidersは1.1.0で廃止されました
のGoogleドキュメントを見ると、ViewModel以下のを取得する方法のサンプルコードが表示されていますViewModel。 val model = ViewModelProviders.of(this).get(MyViewModel::class.java) 最新の依存関係を使用する場合、そのandroid.arch.lifecycle:extensions:1.1.1ようなクラスはありませんViewModelProviders。 のドキュメントに移動するとViewModelProviders、次のようなコメントが表示されました。 このクラスはAPIレベル1.1.0で廃止されました。ViewModelProvider.AndroidViewModelFactoryを使用します 問題は、を使用しようとしたときに、のインスタンスを取得するViewModelProvider.AndroidViewModelFactoryための同等のofメソッドが見つからないことViewModelです。 私がやろうとしたこと: ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java) したがって、メソッドの名前は、create呼び出すたびにViewModelの新しいインスタンスを取得します。これは、私が求めているものではありません。 上記の廃止されたコードの置き換えは何ですか?

4
ViewModelからのLiveDataの観察
データフェッチ(具体的にはFirebase)を処理する別のクラスがあり、通常はそこからLiveDataオブジェクトを返し、非同期で更新します。返されたデータをViewModelに保存したいのですが、問題は、その値を取得するために、データフェッチクラスから返されたLiveDataオブジェクトを監視する必要があることです。監視メソッドには最初のパラメーターとしてLifecycleOwnerオブジェクトが必要でしたが、ViewModel内にそれがないことは明らかであり、ViewModel内のActivity / Fragmentへの参照を保持することになっていないことはわかっています。私は何をすべきか?

2
viewLifecycleOwnerをLifecycleOwnerとして使用する
断片があります: class MyFragment : BaseFragment() { // my StudentsViewModel instance lateinit var viewModel: StudentsViewModel override fun onCreateView(...){ ... } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel = ViewModelProviders.of(this).get(StudentsViewModel::class.java) updateStudentList() } fun updateStudentList() { // Compiler error on 'this': Use viewLifecycleOwner as the LifecycleOwner viewModel.students.observe(this, Observer { //TODO: …

1
ViewModelStoreおよびviewModelStoreOwnerとは何ですか?
この新しいViewModelProvider api(ViewModelProvidersは非推奨)のため、私は非常に混乱しています 新しい変更と同様に、新しいコンストラクター(ソースコード)もあります。 #1 public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory() : NewInstanceFactory.getInstance()); } #2 public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) { this(owner.getViewModelStore(), factory); } #3 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) { mFactory = factory; mViewModelStore = store; } Gradle依存関係: implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02" …

1
ViewModel状態でのViewPager2 / Tabsの問題
私はMVVMパターンに従っています。つまり、フラグメントごとにViewModelがあります。 ViewPager2を使用して2つのタブを追加しました。 私のアダプターは次のようになります: @Override public Fragment createFragment(int position) { switch (position) { case 0: return new MergedItemsFragment(); case 1: return new ValidatedMergedItemsFragment(); } return new MergedItemsFragment(); } タブは機能しています。ただし、MergedItemsFragmentのViewModelの動作がおかしいことに気付きました。タブを追加する前に、次のようにFragmentに移動しました。 NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment); 私がそのフラグメントを残しNavHostFragment.findNavController(this).popBackStack()、後でそのフラグメントに戻ったとき、新しい空のViewModelを取得します。これは意図されたものです。 新しいアプローチで私はナビゲートしていreturn new MergedItemsFragment()ます。そのフラグメントを離れると、後で戻ってきて、古いデータを含む ViewModelを取得しています。ユーザーが別のフラグメントで別のデータを選択したため、古いデータは関係なくなったため、これは問題です。 アップデート#1 同じprintステートメントが複数回呼び出されるため、彼は実際にはすべての古いFragmentをメモリに保持していることに気付きました。それが呼ばれる回数は、私が去ってその画面に戻る回数とともに増加します。したがって、10回離れて戻り、デバイスを回転させると、実際には1行が10回実行されます。ViewModelsで動作するように、ナビゲーションコンポーネントでTabs / ViewPagersを実装する方法を推測しますか? アップデート#2 私は私のViewModelsを次のように設定しました: viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class) 私は同じ結果を得ます: viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class); フラグメント自体にViewModelをバインドします。したがって、thisフラグメントです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.