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”

Anton Shkurenko
źródło

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
Alexander Udalov
źródło
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.

Tom Howard
źródło