android - Hilt 不会注入(inject)作用域 ViewModel

标签 android kotlin android-viewmodel android-architecture-navigation dagger-hilt

我正在尝试将依赖项注入(inject)导航图范围的 ViewModel

这是我的应用程序:

@HiltAndroidApp
class App : Application() 

托管我的 fragment 的 Activity :

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findNavController(R.id.nav_host_fragment).navigate(R.id.main_graph)
    }
}

我的导航图:

<?xml version="1.0" encoding="utf-8"?>
<navigation 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_graph"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.hilt.MainFragment" />

</navigation>

我要注入(inject)到 ViewModel 中的对象:

class Repo @Inject constructor()

我的 View 模型:

@HiltViewModel
class MainViewModel @Inject constructor(
        val repo: Repo,
        application: Application
) : AndroidViewModel(application) {
    fun test(){}
}

我注入(inject) View 模型的 fragment :

@AndroidEntryPoint
class MainFragment : Fragment() {

    val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel.test()
    }
}

现在一切都正常工作,但是当我尝试使用此来确定虚拟机的范围时:

@AndroidEntryPoint
class MainFragment : Fragment() {

    val viewModel: MainViewModel by navGraphViewModels(R.id.main_graph)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel.test()
    }
}

应用程序无法创建我的 ViewModel 并崩溃,留下此堆栈跟踪:

 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.hilt.MainViewModel
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:269)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
        at com.example.hilt.MainFragment.getViewModel(Unknown Source:2)
        at com.example.hilt.MainFragment.onCreate(MainFragment.kt:17)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2936)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:472)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2094)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3122)
        at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:3045)
        at androidx.fragment.app.Fragment.onCreate(Fragment.java:1867)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:264)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2936)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:472)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:141)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:313)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:292)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)

显然 by navGraphViewModels 简写没有使用正确的 VM Factory,我在这里有点不知所措。

最佳答案

使用 androidx.hilt:hilt-navigation-fragment 中的 hiltNavGraphViewModels 而不是 navGraphViewModels

https://developer.android.com/training/dependency-injection/hilt-jetpack#viewmodel-navigation

关于android - Hilt 不会注入(inject)作用域 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66497047/

相关文章:

android - 为什么支持FragmentManager.saveFragmentInstanceState(selectedFragment)!! = 空

android - 如何防止ViewModel再次触发我的加载栏

android - 如何在 Jetpack Compose 中匹配主题和图标之间的颜色属性?

android - 刷新 fragment 不再起作用?

android - 需要帮助将 Scandit 条形码扫描仪集成到 React Native 项目中

android - Ignition RemoteImageView 给出 "Failed creating disk cache directory"警告

Java/安卓/ Kotlin : Reflection on private Field and call public methods on it

android - 使用 Android Gradle Plugin v. 3.5.2 构建 Android 项目时,我的构建失败

kotlin - 如何将 create-react-kotlin-app 作为模块添加到 kotlin-multiplatform 项目?

Android Live数据观察者异常