Android 使用导航、碎片工厂和匕首2时,尝试将navGraph与NavHostFragment关联时发生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

我遇到了相同的错误(还尝试在OnViewCreated中设置图形)。StackOverflow错误的详细信息如下:


在屏幕截图结束后,
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)
    }