通过刀柄注入视图模型后无法构建片段

时间:2021-04-25 07:49:21

标签: android dependency-injection viewmodel dagger-hilt

我正在尝试使用匕首刀柄来提供我的片段视图模型。 所以我像这样注释了我的视图模型:

@HiltViewModel
class MainViewModel @Inject constructor(private val database: TasksDatabase) : ViewModel() {
    ...
}

此外,我还用 @AndroidEntryPoint 注释了我的活动和片段 然后在我的片段中,我像这样实例化了我的 ViewModel:

private val viewModel: MainViewModel by viewModels()

另外,因为 ViewModel 需要一个数据库所以我创建了一个 Hilt 模块:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideDatabase(@ApplicationContext context: Context) = Room.databaseBuilder(
        context.applicationContext,
        TasksDatabase::class.java,
        "student_database"
    ).fallbackToDestructiveMigration().build()

}

应用程序将编译但崩溃:

androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment done.main.MainFragment: calling Fragment constructor caused an exception
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:631)
        at androidx.navigation.fragment.FragmentNavigator.instantiateFragment(FragmentNavigator.java:184)
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:212)
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:58)
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:80)
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:30)
        at androidx.navigation.NavController.navigate(NavController.java:823)
        at androidx.navigation.NavController.onGraphCreated(NavController.java:521)
        at androidx.navigation.NavController.setGraph(NavController.java:482)
        at androidx.navigation.NavController.setGraph(NavController.java:447)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:235)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971)
        at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:305)
        at done.NavigationExtensionsKt.obtainNavHostFragment(NavigationExtensions.kt:225)
        at done.NavigationExtensionsKt.setupWithNavController(NavigationExtensions.kt:34)
        at done.MainActivity.setNavigation(MainActivity.kt:49)
        at done.MainActivity.onCreate(MainActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:6679)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:613)
        at androidx.navigation.fragment.FragmentNavigator.instantiateFragment(FragmentNavigator.java:184) 
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:212) 
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:58) 
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:80) 
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:30) 
        at androidx.navigation.NavController.navigate(NavController.java:823) 
        at androidx.navigation.NavController.onGraphCreated(NavController.java:521) 
        at androidx.navigation.NavController.setGraph(NavController.java:482) 
        at androidx.navigation.NavController.setGraph(NavController.java:447) 
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:235) 
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949) 
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278) 
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) 
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) 
        at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971) 
        at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:305) 
        at done.NavigationExtensionsKt.obtainNavHostFragment(NavigationExtensions.kt:225) 
        at done.NavigationExtensionsKt.setupWithNavController(NavigationExtensions.kt:34) 
        at done.MainActivity.setNavigation(MainActivity.kt:49) 
        at done.MainActivity.onCreate(MainActivity.kt:23) 
        at android.app.Activity.performCreate(Activity.java:6679) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
     Caused by: java.lang.IllegalStateException: Fragment MainFragment{c9d8770} (76068e8e-d2f9-481b-8c21-2221e637565b) not attached to a context.
        at androidx.fragment.app.Fragment.requireContext(Fragment.java:900)
        at done.main.MainFragment.<init>(MainFragment.kt:57)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:430) 
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:613) 
        at androidx.navigation.fragment.FragmentNavigator.instantiateFragment(FragmentNavigator.java:184) 
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:212) 
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:58) 
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:80) 
        at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:30) 
        at androidx.navigation.NavController.navigate(NavController.java:823) 
        at androidx.navigation.NavController.onGraphCreated(NavController.java:521) 
        at androidx.navigation.NavController.setGraph(NavController.java:482) 
        at androidx.navigation.NavController.setGraph(NavController.java:447) 
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:235) 
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949) 
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278) 
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) 
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) 
        at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971) 
        at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:305) 
        at done.NavigationExtensionsKt.obtainNavHostFragment(NavigationExtensions.kt:225) 
        at done.NavigationExtensionsKt.setupWithNavController(NavigationExtensions.kt:34) 
        at done.MainActivity.setNavigation(MainActivity.kt:49) 
        at done.MainActivity.onCreate(MainActivity.kt:23) 
        at android.app.Activity.performCreate(Activity.java:6679) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

更新: 我使用导航组件来管理 MainActivity 中的片段:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        if (savedInstanceState == null)
            setNavigation()

    }


    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        setNavigation()
    }


    private fun setNavigation() {
        val graphID = listOf(
            R.navigation.home,
            R.navigation.profile,
            R.navigation.tasks
        )
        binding.bottomMenu.setupWithNavController(
            navGraphIds = graphID,
            fragmentManager = supportFragmentManager,
            containerId = binding.container.id, intent = intent
        )
    }


}

导航扩展是this link

我想知道应用运行良好,直到我提供了 Hilt 的 ViewModel,那么我如何使用 hilt 提供我的 ViewModel?

0 个答案:

没有答案