kotlin Dagger2中适配器的依赖注入

问题描述 投票:1回答:1

预期结果

[我要做什么是将我的AccountType类注入到ExpandableAdpter,并在单击子视图时检查用户类型?

如何在适配器中实现匕首?

Dagger与Fragment和Activity配合正常。在适配器中仅获得空值,因为无法将适配器初始化为匕首

匕首中的界面示例

//Di interface 
interface ActivityComponent : BaseComponent {
// adapter
fun inject(expDragSwipeAdapter: ExpandableDraggableSwipeableAdapter)

}

组和子视图的适配器onCreate

@Inject lateinit var accountType: Accounts
private lateinit var activityComponent: ActivityComponent

override fun onCreateGroupViewHolder(parent: ViewGroup, viewType: Int): MyGroupViewHolder {
    activityComponent.inject(this)
    val inflater = LayoutInflater.from(parent.context)
    val v: View
    if (isDragRequire) {
        v = inflater.inflate(R.layout.row_edit_watchlist, parent, false)
    } else {
        v = inflater.inflate(R.layout.row_watchlist, parent, false)
    }
    return MyGroupViewHolder(v, isDragRequire, mContext)
}

override fun onCreateChildViewHolder(parent: ViewGroup, viewType: Int): MyChildViewHolder {
    activityComponent.inject(this)
    val inflater = LayoutInflater.from(parent.context)
    val v = inflater.inflate(R.layout.row_child_watchlist, parent, false)
    return MyChildViewHolder(v, false)
}

我在此行activityComponent.inject(this)中遇到错误

在onclick上检查AccountType并实现业务逻辑

android kotlin adapter dagger-2
1个回答
1
投票

不需要为RecyclerView或ListView从适配器内的Dagger 2组件请求注入。

对于片段和活动,我们别无选择,只能明确要求从Component进行注入,因为这些对象是由Android OS实例化的,并且我们不“控制”构造函数。

对于其他所有东西,包括适配器,您应该更喜欢构造函数注入,然后手动设置参数。

惯用语如下所示。在片段内部:

class MyFragment : Fragment {

    @Inject
    lateinit var accountsAdapter: accountsAdapter

    @Inject
    lateinit var accountsRepository: AccountsRepository

    //load accounts in onStart or wherever you decide to load
    //when loading finished, execute the following method in a callback

    fun onAccountsLoaded(accounts: Accounts) {
        adapter.setAccounts(accounts)
    }
}

例如,您的适配器可以执行以下操作:

class Adapter @Inject constructor() : BaseAdapter {

    fun setAccounts(accounts: Accounts) {
        this.accounts = accounts
        notifyDataSetChanged()
    } 
}

您可以看到有关在Dagger 2中使用ListView的官方Google Android建筑示例。链接为here

© www.soinside.com 2019 - 2024. All rights reserved.