2017-08-27 108 views
1

我一直在使用新的dagger.android注入功能,到目前爲止我真的很喜歡它們。是否有可能向Dagger注入Recycler View適配器2.11

但是,我遇到了這個小問題,因此它似乎不可能現場注入一個適配器或基本上我正在使用的任何非活動類。

我知道這將更容易@Inject的構造函數,但由於我通過構造函數將數據傳遞給我的recyclerview,這不是我的選擇。

這意味着我必須調用組件來注入我的類。

隨着AppComponent類,看起來像這樣:

interface AppComponent : AndroidInjector<App> { 

    @Component.Builder 
    abstract class Builder { 
     abstract fun networkModule(networkModule: NetworkModule): Builder 
    } 

    fun inject(someClass SomeClass) 

} 

生成DaggerAppComponent說後不承認.inject()方法DaggerAppComponent.builder().build()

我顯然誤解的東西有關,因爲匕首,這似乎像規範的注入類的方法。

我懷疑這是因爲我從AndroidInjector延伸,但如果是這種情況,我將如何注入一個非活動類。因爲即使我爲此類製作了@Subcomponent,它仍然需要調用DaggerAppComponent

+0

我最終得到這個結果的方式是閱讀本文https:// blog。 davidmedenjak.com/android/2017/11/11/dagger-rules-engagement.html並放棄了我不能構造函數注入適配器的假設。當然,我可以 - 但就像文章所說 - 我正在複製和粘貼我不知道其功能的代碼。在向持有這些項目的適配器添加公共變量後,我可以不再通過構造函數傳遞它們,然後無需大驚小怪地注入所需的依賴項。但是,這也意味着必須將適配器注入視圖模型。 – nmu

回答

0

這是一個品味問題(而且更完美無瑕的代碼設計),但我不認爲您正在這樣做正確的方法。

你是什麼意思,「因爲我通過構造函數將數據傳遞給我的recyclerview」?您將數據分配給適配器,而不是回收器視圖本身。

如果你不希望(但也許應該)使用MVP的做法,加載數據的目標從某處RCV,然後顯示它會是這個樣子:

class TestFragment : Fragment() { 

    val recyclerView: RecyclerView by bind(R.id.recyclerview) // Custom view binding but whatever 
    val adapter: TestAdapter? = null 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
     val view = inflater!!.inflate(R.layout.test, container, false) 

     // Initialize 
     recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) 
     adapter = TestAdapter(mutableListOf()) 
     recyclerView.adapter = adapter 

     // Add data 
     adapter.addItem(MyClass("Hey it's working")) 

     return view 
    } 
} 

至於Android的匕首,實際上我覺得它比普通的匕首更有用。它使事情變得更加複雜。

我強烈建議使用MVP的android。下面是我的一個示例,它消除了任何需要注入任何依賴關係的活動/組件,請隨時查看。MVP sample

+0

是的,我的意思是將數據傳遞給適配器的構造函數,就像你一樣。 'class Adapter(private val data:List ):RecyclerView.Adapter {// ...}'所以我不能'注入',因爲我沒有注入'List '。是的,我使用MVVM,所以這就是我想注入我的依賴關係的全部原因。 – nmu

+2

這不是對這個問題的回答 –

相關問題