Android 在dagger 2中发现依赖循环

Android 在dagger 2中发现依赖循环,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,我试图用DatePickerDialog提供fragment,但当我使用BasicInfoFragment作为参数时,它导致了错误:找到了一个依赖循环 为什么会这样 @Module class ActivityModule(val activity: AppCompatActivity) { @Provides fun provideActivity() = activity @Provides @ActivityContext fun provide

我试图用DatePickerDialog提供fragment,但当我使用BasicInfoFragment作为参数时,它导致了错误:找到了一个依赖循环 为什么会这样

@Module
class ActivityModule(val activity: AppCompatActivity) {

    @Provides
    fun provideActivity() = activity

    @Provides
    @ActivityContext
    fun provideContext(): Context = activity

    // [...]
    @Provides
    fun provideDatePickerDialog(basicInfoFragment: BasicInfoFragment): 
    DatePickerDialog {
        return DatePickerDialog(activity, basicInfoFragment, 1999, 9, 9)
    }
}
片段代码:

class BasicInfoFragment @Inject constructor()
    : BaseFragment(), BasicInfoMvpView , 
      LabelledSpinner.OnItemChosenListener, 
      DatePickerDialog.OnDateSetListener {

    @Inject
    lateinit var datePickerDialog: DatePickerDialog

    @Inject
    lateinit var mPresenter: BasicInfoMvpPresenter<BasicInfoMvpView>

    // user info
    private lateinit var gender: DataManager.UserGender
    private var birthOfDate: Long = 0L


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.base_user_info_layout, container, false)

        activityComponent?.let {
            it.inject(this)
            mPresenter.onAttach(this)
        }

        return view
    }

    override fun onDateSet(dataPicker: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
        birthOfDate = GregorianCalendar(year, month, dayOfMonth).timeInMillis
    }
}
在您提供的DatePickerDialog中,您需要一个BasicInfoFragment,但是当您还尝试在BasicInfoFragment中注入DatePickerDialog时。因此就出现了鸡或蛋的问题——要创造其中一个,你需要另一个

需要考虑的其他事项:在DateTimePicker的构造函数中,您确实需要DatePickerDialog.OnDateSetListener,而不是BasicInfo片段

解决方案1

更改提供的DatePickerDialog,如下所示

@Provides
fun provideDatePickerDialog(basicInfoFragment: BasicInfoFragment): 
DatePickerDialog {
    return DatePickerDialog(activity)
}
然后在片段中设置侦听器和日期。见文件

解决方案2

不要为DatePickerDialog提供Dagger,而是在BasicInfo片段中使用以下行创建它:

DatePickerDialog(activity, this, 1999, 9, 9)

通过这种方式,您还可以消除其他可能的问题和困惑。

在感谢您之前,解决方案1:调用需要API级别24当前分钟为19:new android.app.DatePickerDialog。很遗憾,我将使用解决方案2。否。您是否已从ActivityModule中删除提供的DatePickerDialog?是的,我将使用解决方案2。它工作正常,但此解决方案中没有DI