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);
今のところ、私のために働いている唯一のものは使用することでした:MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);
しかし、私はまだアドバイスに感謝しています。これはnew ViewModelProvider(this).get(MainActivityViewModel.class);
を使用して異なる方法で行うことができます
単に置き換える:
この:
boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.Java)
これとともに:
boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.Java)
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 MainViewModel
はAndroidViewModel
を拡張するため、入力パラメーターとしてアプリケーションが必要であることに注意してください。
ViewModel viewModel = ViewModelProviders.of(this).get(ViewModel.class);
Androidサポートライブラリのバージョンは廃止されました。したがって、Androidxを確実にインポートする必要があります。そして、Gradleファイルにandroidx依存関係を実装する必要があります。
「新しい」キーワードで新しいViewModelオブジェクトを作成することはお勧めしません。