El procesamiento de anotaciones de Kotlin ignora los elementos con nombres similares
Hace poco convertí la mayoría de mi proyecto a kotlin. Ahora encuentro varios errores inusuales que parecen referirse a bibliotecas de anotaciones. Huelga decir que no sucedió en Java.
Describiré los casos, uno en Dagger y otro en Butterknife.
- Asociar la certificación para desarrolladores de android
- Dagger 2 Named no se puede proporcionar sin un método @Provides
- El constructor de vista personalizada en Android 4.4 se bloquea en Kotlin, ¿cómo arreglarlo?
- La documentación de Kotlin no admite etiquetas como '<p>' well
- Persistencia de habitaciones @Relation trabajando en Java pero no en Kolin
1. Al tener 2 métodos @Provides
en diferentes modelos con el mismo nombre. Por ejemplo, en el archivo "FooProvider.kt" que tiene un método "provideFooOrBar"
@Module class FooProvider(private val view: FooActivity) { ... @Provides @FooScope fun provideView() = view @Provides @FooScope fun provideFooOrBar() = Foo() }
Y tener otro archivo "BarProvider.kt" con el mismo nombre de método
@Module class BarProvider(private val view: BarActivity) { ... @Provides @BarScope fun provideView() = view @Provides @BarScope fun provideFooOrBar() = Bar() }
En este caso, Dagger no genera algunas bibliotecas de fábrica y obtengo el siguiente error de compilación: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory
Se puede encontrar un proyecto de ejemplo que reproduce el problema en https://github.com/maxandron/DaggerIssue325
2. Este es un problema al usar Butterknife. Cuando se tienen dos variables anotadas @Bind
en dos clases diferentes – ¡Una de ellas simplemente falla al inicializarse en tiempo de ejecución sin ningún error de compilación!
Por ejemplo si tengo:
class FooActivity { @Bind(R.id.foo) lateinit var mFoo: View } class NotFooActivity { @Bind(R.id.not_foo) lateinit var mFoo: View }
Entonces uno de ellos (o ambos?) Simplemente fallará al inicializar sin ningún error. kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
un kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
excepción para ser lanzado cuando se accede al campo.
¿Es algo que estoy haciendo mal en la configuración de Kotlin o es un error de kotlin?
¡Gracias de antemano! Ron
- Advertencia de tiempo de ejecución de Kotlin desactualizada (plugin Kotlin 1.1.2-release-Studio2.3-3)
- ¿Cómo interactúa Kotlin con Java y JavaScript?
- ¿Tiene Kotlin personalizado obtener la llamada al método de ejecución
- Android N Java 8 características (Jack compilador) y Kotlin interoperabilidad
- Controles de pelusa de Kotlin y android
- Experimental JUnit apoyo en Android + Kotlin no funciona
- Kotlin cuando con varios valores no funciona cuando el valor es una vista de Android
- Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>
Estaba teniendo este problema, así que comencé a investigar y es causado porque Kapt está comprobando solamente el nombre del método al compararlos, y se agregan en un sistema , así que los duplicados no se permiten. Lo mismo ocurre con los campos anotados, por lo que actualmente puede tener un nombre de método / campo por anotación.
He añadido el nombre de la clase al método de equals
y las anotaciones fueron manejadas correctamente ahora, pero las pruebas se rompieron y no sé cómo funcionan, así que espero que alguien sepa cómo arreglar esto.
Resultó ser un error con kapt. He publicado un problema en el rastreador de errores de Kotlin y el problema ahora está marcado como fijo.
Esta solución se fusionó
Se debe resolver en Kotlin versión 1.0.2
Así que para responder algo a la kotlin.UninitializedPropertyAccessException: lateinit
cuestión, estaba corriendo en la misma cosa en mi proyecto . Lo que hice que "solucionó el problema" para mí fue eliminar a Butterknife de la clase ofensiva, en este caso fue sólo un viewHolder para mi nuevo RecyclerView ampliable y, a continuación, ejecutar la aplicación de nuevo.
Ejecutar la aplicación, después de cambiar todo mi @Bind(R.id.my_view_id)
a la "vieja escuela" findViewById(R.id.my_view_id) as MyViewType
trabajado, pero luego posteriormente Butterknife
la misma clase de nuevo a Butterknife
y el Butterknife
Se fue, y parece que no volverá a menos que algo en la clase cambie, entonces tendrá que repetir este proceso de nuevo.
Mi sospecha aquí es que esto tiene algo que ver con Kotlin no apoyar la compilación incremental, y de alguna manera al cambiar el código generado automáticamente que se vio obligado a recompilar. Pero podría estar muy lejos de aquí, sólo pensé que compartiría mi experiencia.
- Android: ellipsize end – Caracteres adicionales después de la elipse
- Cálculo de la distancia dentro de un edificio