web-dev-qa-db-ja.com

2020年のViewModelのインスタンスを取得するにはどうすればよいですか?

Mvvmパターンは初めてです。メインアクティビティのViewModelを作成しました。次に、メインアクティビティでViewModelのインスタンスを取得します。

Stackoverflowのほとんどのチュートリアルと回答では、_ViewModelProviders.of(..._の使用を推奨していますが、これは非推奨です。

したがって、stackoverflowに関するこの質問によると、 ViewModelProvidersは1.1.0で非推奨になっています onCreateのメインアクティビティとして、以下を実行します(そして、すでに実行していることを誓うことができます):mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

ただし、適切なコンストラクターが見つからなかったというエラーメッセージが表示されます。

error: no suitable constructor found for ViewModelProvider(MainActivity)

あるいは、MainActivityがViewModelStoreOwnerであることを完全に明確にするために、変数_ViewModelStoreOwner vmso = this;_を作成し、その変数を次のようにコンストラクターに入れました:mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);

4
Gerke

今のところ、私のために働いている唯一のものは使用することでした:MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);

しかし、私はまだアドバイスに感謝しています。これはnew ViewModelProvider(this).get(MainActivityViewModel.class);を使用して異なる方法で行うことができます

0
Gerke

重複する質問で、すでにここで回答済み

単に置き換える:

この:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.Java)

これとともに:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.Java)
0
Devara

ViewModelFactoryを使用できます:

val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.Java)

VMFactoryコード:

class VMFactory(application: Application) : ViewModelProvider.NewInstanceFactory() {

    val _application: Application=application

    @NonNull
    override fun <T : ViewModel?> create(@NonNull modelClass: Class<T>): T {
            return  MainViewModel(_application) as T
    }
}

ここでmy MainViewModelAndroidViewModelを拡張するため、入力パラメーターとしてアプリケーションが必要であることに注意してください。

0
vaishak bg

ViewModel viewModel = ViewModelProviders.of(this).get(ViewModel.class);

Androidサポートライブラリのバージョンは廃止されました。したがって、Androidxを確実にインポートする必要があります。そして、Gradleファイルにandroidx依存関係を実装する必要があります。

「新しい」キーワードで新しいViewModelオブジェクトを作成することはお勧めしません。

0
barutto