是否可以使用Dagger 2.11现场注入Recycler View适配器

时间:2017-08-27 07:55:08

标签: android kotlin dagger

我一直在使用新的dagger.android注射功能,到目前为止我真的很喜欢它们。

然而,我遇到了这个小问题,因此似乎不可能现场注入适配器或基本上我正在使用的任何非活动类。

我知道@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()方法

我显然误解了关于Dagger的一些事情,因为这似乎是注入课堂的规范方式。

我怀疑是因为我从AndroidInjector延伸,但如果是这种情况,我将如何注入非活动类。因为即使我为该课程制作了@Subcomponent,仍然需要从DaggerAppComponent

调用

1 个答案:

答案 0 :(得分:0)

这是一个品味问题(更完美无瑕的代码设计),但我不认为你这样做是正确的。

你是什么意思&#34;因为我通过构造函数将数据传递给我的recyclerview&#34;?您将数据分配给适配器,而不是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 dagger,我实际上并没有发现它比普通的匕首更有用。它使事情变得更加复杂。

我强烈建议使用MVP for android。这是我的一个示例,它消除了对活动/组件任何需要注入任何依赖关系的任何需求,随意查看MVP sample