Android 使用导航、碎片工厂和匕首2时,尝试将navGraph与NavHostFragment关联时发生Stackoverflow错误?
我遇到了相同的错误(还尝试在OnViewCreated中设置图形)。StackOverflow错误的详细信息如下:Android 使用导航、碎片工厂和匕首2时,尝试将navGraph与NavHostFragment关联时发生Stackoverflow错误?,android,navigation,fragment,stack-overflow,dagger-2,Android,Navigation,Fragment,Stack Overflow,Dagger 2,我遇到了相同的错误(还尝试在OnViewCreated中设置图形)。StackOverflow错误的详细信息如下: 在屏幕截图结束后,checkForMenus和isMenuAvailable行是否继续循环很长时间?如果是这样的话,你的一个片段可能是它自己的孩子(或后代)。是的,我发现我基本上需要一个空白片段来控制导航 class FragmentProviderFactory @Inject constructor( private val providers: Map<Clas
在屏幕截图结束后,
checkForMenus
和isMenuAvailable
行是否继续循环很长时间?如果是这样的话,你的一个片段可能是它自己的孩子(或后代)。是的,我发现我基本上需要一个空白片段来控制导航
class FragmentProviderFactory @Inject constructor(
private val providers: Map<Class<out Fragment>, @JvmSuppressWildcards Provider<Fragment>>
) : FragmentFactory() {
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
val fragmentClass = loadFragmentClass(classLoader, className)
val provider = providers[fragmentClass] ?:
providers.asIterable().firstOrNull(){
fragmentClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown fragment class $fragmentClass")
return try {
provider.get()
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
@Module
abstract class MainFragmentModule {
@MainScope
@Binds
@IntoMap
@FragmentKey(NotificationFragment::class)
abstract fun provideNotificationFragment(fragment: NotificationFragment): Fragment
@MainScope
@Binds
abstract fun bindFragmentProviderFactory(
fragmentProviderFactory: FragmentProviderFactory
): FragmentFactory
}
@MainScope
@Subcomponent(
modules = [MainModule::class, MainFragmentModule::class, MainViewModelModule::class]
)
interface MainComponent {
fun inject(activity: MainActivity)
}
class MainActivity : AppCompatActivity() {
@Inject lateinit var fragmentProviderFactory: FragmentProviderFactory
override fun onCreate(savedInstanceState: Bundle?) {
(applicationContext as MyApplication).appComponent.mainComponent().inject(this)
supportFragmentManager.fragmentFactory = fragmentProviderFactory
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
class NotificationFragment @Inject
constructor(provider: Provider<MainViewModel>,
private val fragmentFactory: FragmentProviderFactory): NavHostFragment() {
private val mainViewModel: MainViewModel by activityViewModelWithProvider {
provider.get()
}
private val DIALOG_FRAGMENT = 1
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_notification, container, false)
return view.rootView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn_start.setOnClickListener{
val action = NotificationFragmentDirections.actionNotificationFragmentToNotificationDialogFragment()
navController.navigate(action)
}
}
}
<fragment
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.gcgsauce.notify.ui.NotificationFragment"/>
override fun onCreateNavController(navController: NavController) {
super.onCreateNavController(navController)
navController.graph = (navController.navInflater).inflate(R.navigation.nav_main)
}