[英]Found a dependency cycle in dagger 2
我嘗試為DatePickerDialog
提供片段,但是當我使用BasicInfoFragment
作為參數時,會導致錯誤: Found a dependency cycle
為什么會發生?
@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
}
}
在您的provideDatePickerDialog
您需要一個BasicInfoFragment
,但是當您還嘗試在BasicInfoFragment
注入DatePickerDialog
時。 因此,雞肉或雞蛋的問題-要創建它們中的一個,就需要另一個。
需要考慮的其他事項:在DateTimePicker的構造函數中,您確實需要DatePickerDialog.OnDateSetListener
而不是BasicInfoFragment
。
解決方案1
更改providerDatePickerDialog,如下所示
@Provides
fun provideDatePickerDialog(basicInfoFragment: BasicInfoFragment):
DatePickerDialog {
return DatePickerDialog(activity)
}
然后在片段中設置偵聽器和日期。 在這里查看文檔
解決方案2
不要為DatePickerDialog提供Dagger,而是在BasicInfoFragment中使用以下代碼行創建它:
DatePickerDialog(activity, this, 1999, 9, 9)
這樣,您還將消除其他可能的問題和困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.