【发布时间】:2016-04-24 08:32:51
【问题描述】:
从今天开始,当我尝试构建我的 Kotlin Android 应用时,我在 Gradle 构建中遇到了以下错误:
Error:cannot access Baz
bad class file: /Users/me/projects/site/android/app/build/tmp/kapt/debug/classFileStubs/com/company/foo/Bar$Baz.class
bad RuntimeInvisibleParameterAnnotations attribute: Baz(FragmentManager)
Please remove or make sure it appears in the correct subdirectory of the classpath.
它指向一个扩展 android.support.v4.app.FragmentStatePagerAdapter 的内部类 Baz。我可以通过注释掉类以及外部类中对它的任何引用并重新构建来临时解决该错误。错误消失了,但显然该类不再存在,因此其他事情在运行时会中断。然后,如果我取消注释并构建,它将适用于几个构建。然后错误又回来了。冲洗并重复。我认为关闭 Genymotion 模拟器可能会触发它。
还有其他人遇到过这个问题,或者有什么想法吗?
这是有问题的代码:
class Bar : Fragment() {
@Inject
lateinit var api:ApiRequester
var data : ArrayList<Data> = ArrayList()
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
//[...] view creation code
//[...] data population code
viewPager.adapter = Baz(childFragmentManager)
//[...] more view creation code
}
inner class Baz(fm:FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getCount(): Int {
return data.count()
}
override fun getItem(position: Int): Fragment? {
var jf = FooFragment()
var bundle = Bundle()
bundle.putParcelable("data", data[position])
jf.arguments = bundle
return jf
}
}
编辑:抱歉,Baz 扩展了 FragmentStatePagerAdapter,而不是我最初所说的 Fragment。我用的是 Dagger2,在这里完全可以发挥作用。
【问题讨论】:
-
能否请您发布一个引起问题的示例?我怀疑它可能与注释处理有关,因此有关使用的库(即 ButterKnife 或 Dagger)的任何其他信息都可以派上用场
-
您使用的是哪个版本的 Kotlin?
-
根据Android Studio,我使用的是版本:1.0.0-beta-4584-IJ141-13
-
我只有在类上使用
inner修饰符时才会得到这个。但是,不使用它是一个相当大的不便。我希望你能找到解决方案(我也会寻找)。 -
您是否考虑过没有设置 proguard 的可能性? “RuntimeInvisibleParameterAnnotations 为方法参数指定在编译时可见的注释。编译器和注释处理器可以使用这些注释。”来自proguard.sourceforge.net/manual/attributes.html