AndroidXでViewModelをインスタンス化する方法 質問する

AndroidXでViewModelをインスタンス化する方法 質問する

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 依存関係によって既に含まれていなければなりません)。Fragmentandroidx.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

おすすめ記事