Die Kotlin-Annotationsverarbeitung ignoriert Elemente mit ähnlichen Namen

9

Ich habe kürzlich den Großteil meines Projekts in Kotlin umgewandelt. Jetzt stoße ich auf einige ungewöhnliche Fehler, die sich alle auf Annotationsbibliotheken beziehen. Unnötig zu sagen, dass es in Java nicht passiert ist.

Ich werde die Fälle beschreiben - einen in Dagger und einen in Butterknife.

1. Bei 2 @Provides -Methoden in verschiedenen Modellen mit demselben Namen. Zum Beispiel in der Datei "FooProvider.kt" mit einer "provideFooOrBar" -Methode

%Vor%

Und eine andere Datei "BarProvider.kt" mit dem gleichen Methodennamen

%Vor%

In diesem Fall erzeugt Dagger einige Fabrikbibliotheken nicht und ich bekomme den folgenden Kompilierungsfehler: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory

Ein Beispielprojekt, das das Problem reproduziert, finden Sie unter Ссылка

2. Dies ist ein Problem bei der Verwendung von Butterknife. Wenn zwei @Bind annotierte Variablen in zwei verschiedenen Klassen enthalten sind - Eine von ihnen kann gerade nicht zur Laufzeit ohne Kompilierungsfehler initialisiert werden!

Zum Beispiel wenn ich:

%Vor%

Dann wird einer von ihnen (oder beide?) einfach nicht ohne Fehler initialisiert. Die Ausgabe einer kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized -Ausnahme wird ausgelöst, wenn auf das Feld zugegriffen wird.

Ist es etwas, was ich falsch mache, wenn ich Kotlin konfiguriere oder ist es ein Kotlin-Bug?

Vielen Dank im Voraus! Ron

    
maxandron 25.02.2016, 17:07
quelle

3 Antworten

1

Es stellte sich heraus, dass es ein Bug mit kapt war. Ich habe ein Problem auf Kotlins Bug-Tracker gepostet und das Problem ist jetzt als behoben markiert.

Diese Lösung wurde zusammengeführt

Sollte in Kotlin Version 1.0.2 gelöst werden.

    
maxandron 31.03.2016, 16:09
quelle
3

Ich hatte dieses Problem, also fing ich an zu untersuchen und es wurde verursacht, weil Kapt prüft nur den Methodennamen , wenn er sie vergleicht, und sie werden in einem Set hinzugefügt , also Duplikate sind nicht erlaubt. Dasselbe gilt für annotierte Felder. Daher können Sie derzeit pro Annotation einen Methoden- / Feldnamen angeben.

Ich habe den Klassennamen der equals -Methode hinzugefügt und die Anmerkungen wurden jetzt richtig gehandhabt, aber die Tests sind abgebrochen und ich weiß nicht, wie sie funktionieren, also hoffe ich, dass jemand weiß, wie das zu beheben ist.

    
inorichi 20.03.2016 18:29
quelle
0

Um das Problem kotlin.UninitializedPropertyAccessException: lateinit etwas zu beantworten, stieß ich genau auf dasselbe Problem in meinem Projekt . Was ich getan habe, was das Problem für mich gelöst hat, war, Butterknife aus der beleidigenden Klasse zu entfernen, in diesem Fall war es nur ein viewHolder für meinen neuen erweiterbaren RecyclerView, und dann starte ich die App erneut.

Die App läuft, nachdem ich alle meine @Bind(R.id.my_view_id) auf die "alte Schule" findViewById(R.id.my_view_id) as MyViewType gewechselt habe, aber dann später habe ich die gleiche Klasse zurück auf Butterknife und% co_de geschaltet % ging weg, und es scheint, dass es nicht zurückkommen wird, wenn sich etwas in der Klasse nicht ändert, dann müssen Sie diesen Vorgang noch einmal wiederholen.

Mein Verdacht hier ist, dass dies etwas damit zu tun hat, dass Kotlin keine inkrementelle Kompilierung unterstützt und irgendwie den automatisch generierten Code, den er neu kompilieren musste, ändert. Aber ich könnte hier weit weg sein, dachte nur, ich würde meine Erfahrung teilen.

    
Derek 28.02.2016 23:07
quelle