Android 在dagger 2中发现依赖循环
我试图用DatePickerDialog提供fragment,但当我使用BasicInfoFragment作为参数时,它导致了错误:找到了一个依赖循环 为什么会这样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
@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