簡體   English   中英

在匕首2中發現了一個依賴循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM