使用 Fragment Factory 和 Navigation Component 时,View 没有设置 NavController
View does not have a NavController set when using Fragment Factory and Navigation Component
我正在重构我的应用程序以使用 Fragment Factory。在重构之前,导航组件一切正常,但现在片段无法再找到导航控制器,错误:
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.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)
}
}
}
在我的模块中是这样提供的:
@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)
}
我做错了什么?
当您设置 FragmentFactory
时,它负责实例化 每个 片段 AuthActivity
可能需要的。但是,当系统尝试实例化 NavHostFragment
时,您的工厂会创建一个 LauncherFragment
。这意味着您实际上从未创建过 NavHostFragment
,并且您没有 NavController
.
您的 else
案例不应创建 LauncherFragment
,而是应创建所请求的片段 class。
else -> {
super.instantiate(classLoader, className)
}
我正在重构我的应用程序以使用 Fragment Factory。在重构之前,导航组件一切正常,但现在片段无法再找到导航控制器,错误:
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.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)
}
}
}
在我的模块中是这样提供的:
@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)
}
我做错了什么?
当您设置 FragmentFactory
时,它负责实例化 每个 片段 AuthActivity
可能需要的。但是,当系统尝试实例化 NavHostFragment
时,您的工厂会创建一个 LauncherFragment
。这意味着您实际上从未创建过 NavHostFragment
,并且您没有 NavController
.
您的 else
案例不应创建 LauncherFragment
,而是应创建所请求的片段 class。
else -> {
super.instantiate(classLoader, className)
}