android - icon - El proceso de anotación de Kotlin ignora elementos con nombres similares
toolbar android text (3)
Recientemente convertí la mayoría de mi proyecto a kotlin. Ahora encuentro varios errores inusuales que parecen relacionarse con las bibliotecas de anotaciones. Huelga decir que no sucedió en Java.
Describiré los casos: uno en Dagger y otro en Butterknife.
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 Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory
el siguiente error de compilación: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory
Un proyecto de muestra que reproduce el problema se puede encontrar en https://github.com/maxandron/DaggerIssue325.
2. Este es un problema cuando se usa Butterknife. Cuando se tienen dos variables @Bind
anotadas en dos clases diferentes: ¡una de ellas simplemente no se inicializa en el 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 no se iniciará sin ningún error. kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
una kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
excepción cuando se acceda al campo.
¿Es algo que estoy haciendo mal al configurar Kotlin o es un error de Kotlin?
¡Gracias de antemano! Ron
Así que para responder de alguna manera a la kotlin.UninitializedPropertyAccessException: lateinit
problema kotlin.UninitializedPropertyAccessException: lateinit
, me encontré con exactamente lo mismo en mi proyecto . Lo que hice que "resolvió el problema" para mí fue eliminar Butterknife de la clase ofensiva, en este caso solo era un viewHolder para mi nuevo RecyclerView expandible, y luego ejecutar la aplicación de nuevo.
Al ejecutar la aplicación, después de cambiar todo mi @Bind(R.id.my_view_id)
a "old school" findViewById(R.id.my_view_id) as MyViewType
funcionaba, pero luego, posteriormente, findViewById(R.id.my_view_id) as MyViewType
la misma clase a Butterknife
y a Butterknife
se fue, y parece que no volverá a menos que algo en la clase cambie, entonces tendrá que repetir este proceso nuevamente.
Mi sospecha aquí es que esto tiene algo que ver con que Kotlin no admite 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í, solo pensé en compartir mi experiencia.
Estaba teniendo este problema, así que comencé a investigar y se debe a que Kapt solo está comprobando el nombre del método al compararlos, y se agregan en un conjunto , por lo que los duplicados no están permitidos. Lo mismo ocurre con los campos anotados, por lo que actualmente puede tener un método / nombre de campo por anotación.
Agregué el nombre de la clase al método equals
y las anotaciones se manejaron correctamente ahora, pero las pruebas se rompieron y no sé cómo funcionan, así que espero que alguien sepa cómo solucionarlo.
Resultó ser un error con kapt. Publiqué un problema en el rastreador de errores de Kotlin y el problema ahora está marcado como fijo.
Debería resolverse en la versión 1.0.2 de Kotlin