AndroidXライブラリを使用してActivityでViewModelを初期化したい
ドキュメントに書かれていることを試してみましたが、うまくいきません。「.of」が解決されません。
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.myapplication.databinding.ActivityMainBinding`
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
binding.setLifecycleOwner(this)
var model = ViewModelProvider.of(this).get(SheduleViewModel::class.java)
}
}
は解決されていません。AndroidXで別の方法があるかもしれません
ベストアンサー1
更新された回答:
状況は少し変わりました。以前は必要だった依存関係が - ViewModelProviders
-廃止された(詳細については、以前の回答を参照してください)。これで、ViewModelProvider
コンストラクターを直接使用できるようになりました。
したがって、この場合の答えは次のようになります。
private val viewModel = ViewModelProvider(this).get(SheduleViewModel::class.java)
ただし、androidx.activity:activity-ktx:$Version
依存関係を含める場合 (よく使用される AndroidX 依存関係のいくつかにはすでに依存関係が含まれています)、プロパティ委任を利用できることに注意してください。
private val viewModel: SheduleViewModel by viewModels()
これは内部的に を使用しViewModelProvider
、 をViewModel
のスコープとします。これは、同じことをより簡潔に記述する方法です。 の代わりに依存関係を含めることでActivity
、 に対して同じことを行うことができます(この場合も、他の AndroidX 依存関係によって既に含まれていなければなりません)。Fragment
androidx.fragment:fragment-ktx:$Version
ViewModelProvider
コンストラクターと はどちらもby viewModels()
、ファクトリをパラメーターとして受け入れます ( を注入するのに便利ですViewModel
)。
private val viewModel =
ViewModelProvider(this, viewModelFactory).get(SheduleViewModel::class.java)
そして
private val viewModel: SheduleViewModel by viewModels { viewModelFactory }
自分に最も適したものを使用してください。
古い回答:
androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion
インポートするために依存関係を追加しますViewModelProviders
。