Recentemente ho convertito la maggior parte del mio progetto in kotlin. Ora ho riscontrato diversi errori insoliti che sembrano tutti correlati alle librerie di annotazioni. Inutile dire che non è successo in Java.L'elaborazione dell'annotazione di Kotlin ignora elementi con nomi simili
Descriverò i casi: uno in Dagger e uno in Butterknife.
1. Se si dispone di 2 metodi @Provides
in diversi modelli con lo stesso nome. Per esempio nel file "FooProvider.kt" avere un metodo "provideFooOrBar"
@Module
class FooProvider(private val view: FooActivity) {
...
@Provides @FooScope fun provideView() = view
@Provides @FooScope fun provideFooOrBar() = Foo()
}
E avere un altro file "BarProvider.kt" con lo stesso nome del metodo
@Module
class BarProvider(private val view: BarActivity) {
...
@Provides @BarScope fun provideView() = view
@Provides @BarScope fun provideFooOrBar() = Bar()
}
In questo caso, Pugnale fallisce per generare alcune librerie di fabbrica e ottengo il seguente errore di compilazione: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory
un progetto di esempio che riproduce il problema può essere trovato alla https://github.com/maxandron/DaggerIssue325
2. Questo è un problema quando si utilizza Butterknife. Quando si hanno due variabili annotate @Bind
in due classi diverse - Una di queste non riesce a inizializzarsi in fase di esecuzione senza alcun errore di compilazione!
Per esempio se ho:
class FooActivity {
@Bind(R.id.foo) lateinit var mFoo: View
}
class NotFooActivity {
@Bind(R.id.not_foo) lateinit var mFoo: View
}
Poi uno di loro (? O entrambi) sarà solo riuscire inizializzare senza alcun errore. Causando un'eccezione kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
da lanciare quando si accede al campo.
È qualcosa che sto facendo male nella configurazione di Kotlin o è un bug kotlin?
Grazie in anticipo! Ron
Queste due domande sembrano estranei a me, per favore non chiedere due domande differenti in un singolo SO posto la prossima volta –
li ho postato nel stessa domanda perché il do sembra correlato. Non penso che sia un pugnale o un insetto butterknife - penso che sia un insetto kotlin. Non sto cercando di trovare soluzioni per l'errore - li conosco, voglio capire la causa – maxandron
Probabilmente sono due problemi diversi. Uno per i metodi e un altro per cui hai posizionato l'annotazione su una proprietà. Leggi l'annotazione Uso-Obiettivi del sito e verifica se questo aiuta a risolvere il secondo https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets insieme a renderlo un JvmField che doffing su cosa butterknife vuole https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields –