Özellik başlatılmalı veya soyut olmalıdır


121

Aptalca bir soru olmalı, ama Kotlin konusunda gerçekten yeniyim ve herhangi bir çözüm bulamadım.

Sınıf alanı nasıl ilan edilir? Java'da yapabileceğimiz gibi:

protected SharedPreferences mSharedPreferences;

Ve daha sonra onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Şimdi onu istediğim her yerde kullanabilirim (bu temel aktivitenin alt sınıflarında).

Kotlin'de de aynısını yapmaya çalışıyorum:

protected var sharedPreferences : SharedPreferences

Ve içinde onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Ancak bir uyarı alıyorum: "Özellik başlatılmalı veya soyut olmalı"

Yanıtlar:


189

Yapıcının dışında bir özelliği başlatmak istiyorsanız, geç başlatılan özellikler arıyor olabilirsiniz. Mülkü lateinit, aksi takdirde gerekli olan başlatıcıyı atlamaya izin verecek ve ona anlamlı bir değer atanana kadar mülke erişimin istisnai olarak başarısız olmasına neden olacak değiştiriciyle bildirin :

protected lateinit var sharedPreferences: SharedPreferences

12
"Korumalı var sharedPreferences: SharedPreferences? = Null" kullanmaya çalıştım ve bu da çalışıyor, fark nedir?
Anton Shkurenko

DI için Dagger2 kullanırsam, varyantınızı kullanmam gerektiğini anlıyorum, değil mi?
Anton Shkurenko

30
Aradaki fark, null yapılamayan değerleri lateinit ile bildirebilmenizdir.
Kirill Rakhman

16

Bunu, Alexander Udalov'un görünürlük yanıtının yorumlarından çıkarmak. Null yapılabilir özellikler için:

protected var sharedPreferences : SharedPreferences? = null

... ve ona daha sonra bir değer atayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.