当使用Fragment Factory和Navigation Component时,View没有设置NavController。

问题描述 投票:0回答:1

我正在重构我的应用程序,使用碎片工厂。重构前导航组件一切正常,但现在碎片找不到导航控制器了,错误。

java.lang.IllegalStateException: View androidx.constraintlayout.widget.ConstraintLayout{7c24bdc V.E...... ......I. 0,0-1080,2088 #7f0a0061 app:id/auth_nav_host_fragment} does not have a NavController set
    at androidx.navigation.Navigation.findNavController(Navigation.java:84)
    at androidx.navigation.fragment.NavHostFragment.findNavController(NavHostFragment.java:118)
    at androidx.navigation.fragment.FragmentKt.findNavController(Fragment.kt:29)
    at com.kalianey.oneness.ui.auth.LauncherFragment.navLogin(LauncherFragment.kt:42)
    at com.kalianey.oneness.ui.auth.LauncherFragment.access$navLogin(LauncherFragment.kt:16)
    at com.kalianey.oneness.ui.auth.LauncherFragment$onViewCreated$1.onClick(LauncherFragment.kt:28)

我创建了一个碎片工厂。

@AuthScope
class AuthFragmentFactory
@Inject
constructor(
private val viewModelFactory: ViewModelProvider.Factory
) : FragmentFactory() {

override fun instantiate(classLoader: ClassLoader, className: String) =

    when (className) {

        OnboardingPagerFragment::class.java.name -> {
            OnboardingPagerFragment()
        }

        OnboardingOneFragment::class.java.name -> {
            OnboardingOneFragment()
        }

        OnboardingTwoFragment::class.java.name -> {
            OnboardingTwoFragment()
        }

        OnboardingThreeFragment::class.java.name -> {
            OnboardingThreeFragment()
        }

        LauncherFragment::class.java.name -> {
            LauncherFragment(viewModelFactory)
        }

        LoginFragment::class.java.name -> {
            LoginFragment(viewModelFactory)
        }

        RegisterFragment::class.java.name -> {
            RegisterFragment(viewModelFactory)
        }

        ForgotPasswordFragment::class.java.name -> {
            ForgotPasswordFragment(viewModelFactory)
        }

        else -> {
            LauncherFragment(viewModelFactory)
        }
    }

 }

在我的模块中,我创建了一个碎片工厂: Provided like this in my module:

@JvmStatic
@AuthScope
@Provides
fun provideFragmentFactory(viewModelFactory: ViewModelProvider.Factory, requestManager: RequestManager, sessionManager: SessionManager): FragmentFactory{
    return AuthFragmentFactory(viewModelFactory)
}

我在我的AuthActivity中也是这样设置的。

override fun onCreate(savedInstanceState: Bundle?) {
    inject()
    supportFragmentManager.fragmentFactory = fragmentFactory
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_auth)
}

我到底做错了什么?

android dagger-2 android-jetpack android-architecture-navigation
1个回答
1
投票

当你设置一个 FragmentFactory,它负责实例化 每一 碎片 AuthActivity 可能需要。 然而,当系统试图实例化的是 NavHostFragment你的工厂创建了一个 LauncherFragment 而不是。 这意味着你从未真正创建过一个 NavHostFragment,你没有一个 NavController.

而不是创建一个 LauncherFragment,你的 else 的情况下,应该创建任何一个被请求的片段类。

else -> {
    super.instantiate(classLoader, className)
}
© www.soinside.com 2019 - 2024. All rights reserved.