作者:平凡小店88 | 来源:互联网 | 2023-01-09 17:13
我在kotlin活动中使用ViewPager,我希望在Kotlin Fragment中使用匕首注射.我有错误:Dagger不支持注入私有字段.在Java Fragment中匕首注射工作.为什么我不能在kotlin片段中注入匕首?
在我的kotlin活动中
mPagerAdapter = object : FragmentPagerAdapter(supportFragmentManager) {
private val mFragments = arrayOf(KotlinFragment(), JavaFragment())
private val mFragmentNames = arrayOf(getString(R.string.cashdocuments), getString(R.string.action_absmysql))
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence {
return mFragmentNames[position]
}
}
我的kotlin片段
class KotlinFragment : Fragment() {
@Inject
internal var mSharedPreferences: SharedPreferences? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(activity.application as SamfantozziApp).dgaeacomponent().inject(this)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
val rootView = inflater!!.inflate(R.layout.activity_absserver, container, false)
return rootView
}
}
消息gradle build
![在此输入图像描述](https://img.php1.cn/3cd4a/1eebe/cd5/eec57030b649a106.webp)
1> azizbekian..:
无意中,我遇到了自己的答案,不得不承认,事实上它不起作用(至少对我的用例而言).请考虑Avilio的回答也为我工作:替代internal
用lateinit
.
老答案
删除internal
修饰符.Dagger至少需要包私有访问才能访问带注释的字段.在Kotlin中,internal
修饰符不是 Java的包 - 私有访问修饰符的替代.
有关Java和Kotlin中修饰符之间差异的详细说明,请参阅Fragmented podcast的第101集 - "学习Kotlin - 可见性修饰符,内部修饰符,模块"以及官方文档.
2> Danylo Volok..:
你有错误:
@Inject
internal var mSharedPreferences: SharedPreferences? = null
这看起来像是@Inject
在KotlinFragment
类中添加了注释
请将其更改为此,它将起作用:
var mSharedPreferences: SharedPreferences? = null
@Inject set
以下是文档的链接:https://kotlinlang.org/docs/reference/annotations.html
你也可以:`@set:注入var mSharedPreferences:SharedPreferences?= null`
3> 小智..:
即使删除了内部关键字,我也有同样的错误.所以我用lateinit取代了内部并且它起作用了.
4> Hemant Parma..:
很简单,你可以这样做,改变这一行
@Inject
internal var mSharedPreferences: SharedPreferences? = null
至
@set:Inject
internal var mSharedPreferences: SharedPreferences? = null
这项工作就像我的情况下的魅力.
5> 0xAliHn..:
@Inject
lateinit var mSharedPreferences: SharedPreferences
此外,这对我也适用于后期初始化变量