2015-11-21 35 views
34

To musi być głupie pytanie, ale jestem naprawdę nowy dla Kotlin i nie znalazłem żadnego rozwiązania.Właściwość musi zostać zainicjowana lub być abstrakcyjna

Jak zadeklarować pole klasy? Jak możemy mieć go w Java:

protected SharedPreferences mSharedPreferences; 

a później w onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) 

Teraz można go używać w dowolnym miejscu chcę (w podklas tej działalności podstawowej).

staram się zrobić to samo w Kotlin:

protected var sharedPreferences : SharedPreferences 

I onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) 

Ale pojawia się ostrzeżenie: "Nieruchomość musi być zainicjowany lub być abstrakcyjny"

Odpowiedz

66

Jeśli chcesz zainicjować właściwość poza konstruktorem, a następnie late-initialized properties jest tym, czego możesz potrzebować. Zadeklarować właściwości z modyfikatorem lateinit, który pozwoli na pominięcie wymaganych inaczej inicjatora i sprawi, że dostęp do właściwości niepowodzeniem z wyjątkiem aż jakiś sens wartość jest przypisany do niego:

protected lateinit var sharedPreferences: SharedPreferences 
+3

Próbowałem użyć „chronione sharedPreferences var: SharedPreferences? = Null "i działa również, jaka jest różnica? –

+0

Widzę, że jeśli używam Dagger2 dla DI, muszę użyć waszego wariantu, prawda? –

+11

Różnica polega na tym, że można zadeklarować wartości nie podlegające zerowaniu z lateinitem. –

Powiązane problemy