Właściwość musi być zainicjowana lub abstrakcyjna


121

To musi być głupie pytanie, ale jestem naprawdę nowy w Kotlinie i nie znalazłem żadnego rozwiązania.

Jak zadeklarować pole klasy? Tak jak możemy to mieć w javie:

protected SharedPreferences mSharedPreferences;

A później onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Teraz mogę go używać w dowolnym miejscu (w podklasach tej podstawowej aktywności).

Próbuję zrobić to samo w Kotlinie:

protected var sharedPreferences : SharedPreferences

A w onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Ale pojawia się ostrzeżenie: „Właściwość musi być zainicjowana lub abstrakcyjna”

Odpowiedzi:


188

Jeśli chcesz zainicjować właściwość poza konstruktorem, to właściwości zainicjowane późno są tym, czego możesz szukać. Zadeklaruj właściwość za pomocą lateinitmodyfikatora, co pozwoli na pominięcie wymaganego w innym przypadku inicjatora i spowoduje, że dostęp do właściwości zakończy się niepowodzeniem z wyjątkiem, dopóki nie zostanie do niej przypisana znacząca wartość:

protected lateinit var sharedPreferences: SharedPreferences

12
Próbowałem użyć „protected var sharedPreferences: SharedPreferences? = Null” i to również działa, jaka jest różnica?
— Anton Shkurenko

Widzę, że jeśli używam Dagger2 dla DI, to muszę użyć twojego wariantu, prawda?
— Anton Shkurenko

30
Różnica polega na tym, że za pomocą lateinit można zadeklarować wartości niepodlegające wartości null.
— Kirill Rakhman

15

Wyciągając to z komentarzy z odpowiedzi Aleksandra Udałowa na temat widoczności. W przypadku właściwości dopuszczających wartość null:

protected var sharedPreferences : SharedPreferences? = null

... i przypisz mu wartość później.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.