android - 是否可以使用 Dagger 2.11 现场注入(inject) Recycler View 适配器

标签 android kotlin dagger

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

但是,我遇到了这个小问题,似乎不可能现场注入(inject)适配器或我正在使用的基本上任何非 Activity 类。

我知道 @Inject 构造函数会更容易,但由于我通过构造函数将数据传递到我的 recyclerview,所以这不是我的选择。

这意味着我必须调用组件来注入(inject)我的类。

AppComponent 类看起来像这样:

interface AppComponent : AndroidInjector<App> {

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

    fun inject(someClass SomeClass)

}

生成的 DaggerAppComponent 在说完 DaggerAppComponent.builder().build() 之后无法识别 .inject() 方法

我显然对 Dagger 有一些误解,因为这似乎是注入(inject)类的规范方式。

我怀疑这是因为我正在从 AndroidInjector 进行扩展,但如果是这种情况,我将如何注入(inject)非 Activity 类。因为即使我只为那个类创建了一个 @Subcomponent,它仍然需要从 DaggerAppComponent

调用

最佳答案

这是一个品味问题(以及更完美的代码设计),但我认为您的做法不正确。

“因为我通过构造函数将数据传递到我的 recyclerview”是什么意思?您将数据分配给 Adapter,而不是 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
   }
}

至于安卓 Dagger ,我实际上并不觉得它比普通 Dagger 更有用。这让事情变得更加复杂。

我强烈建议使用 MVP for android。这是我的一个示例,它完全不需要 Activity/组件来注入(inject)任何依赖项,请随意查看 MVP sample

关于android - 是否可以使用 Dagger 2.11 现场注入(inject) Recycler View 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45902830/

相关文章:

java - @Generated 注解使用 gradlew + dagger

java - C2DM,发送消息时出现IOException

android - 从 SDCard 上的图像设置墙纸

java - Android PlaceAutocompleteFragment自动关闭

mongodb - java.lang.NoSuchFieldError : FSYNCED

android - 重组何时发生?改变状态或改变输入

kotlin - 如何在Kotlin中将WHEN用于表达式?

java - Android 上的 Dagger 2 @Singleton 注释类未被注入(inject)

android - 在 Android 中更改抽屉导航标题图标图像

java - 如何在 android 库项目中使用 dagger