studio icon how color change cambiar bar activity android annotations kotlin dagger butterknife

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.