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.