Kotlin在variables声明之后分配委托

所以,基本上我有一个class级:

class App : Application() { lateinit var prefs: SharedPreferences } 

现在,我想添加一个委托属性:

 var isInitialized: Boolean by prefs.boolean() 

问题是这个, isInitialized属性必须被懒惰地初始化,因为我使用的是Android Dagger2框架,它在App创建之后执行注入(在调用onCreate()方法期间):

 class App : Application() { lateinit var prefs: SharedPreferences var isInitialized: Boolean = false override fun onCreate() { super.onCreate() // how can I assign a delegate to isInitialized? } } 

我希望通过以下方式来完成:

  • 在声明中的懒惰初始化(这是委托在委托 – 怀疑这是否可能?)
  • 在赋值期间延迟初始化

有没有办法做到这一点?

谢谢!

使用懒惰

从文档Lazy获取当前Lazy实例的延迟初始化值。 一旦这个值被初始化,它就不会在这个Lazy实例的其余生命期间改变。

应用程序类

 val prefs: Prefs by lazy { App.prefs!! } class App : Application() { companion object { var prefs: Prefs? = null } override fun onCreate() { prefs = Prefs(applicationContext) super.onCreate() } } 

你的数据模型类应该是这样的

 class Prefs (context: Context) { val PREFS_FILENAME = "com.teamtreehouse.colorsarefun.prefs" val IsInitialized = "isInitialized" val prefs: SharedPreferences = context.getSharedPreferences(PREFS_FILENAME, 0); var initialized: Boolean get() = prefs. getBoolean(IsInitialized, false) set(value) = prefs.edit(). putBoolean(IsInitialized, value).apply() } 

然后使用Activity或片段

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val initialized = prefs.initialized //getvalue selectvalue(false)// set value } private fun selectvalue(value: Boolean) { prefs.initialized = value } } 

更多的细节参考这个例子SharedPreferences Easy与Kotlin

可以用间接的方式做到这一点:

 class DoubleDelegate(var realDelegate: ReadWriteProperty = /* some default */) : ReadWriteProperty by realDelegate 

然后

 val isInitializedDelegate = DoubleDelegate() var isInitialized: Boolean by isInitializedDelegate override fun onCreate() { super.onCreate() isInitializedDelegate.realDelegate = prefs.boolean() } 

不知怎的,我不认为这是一个好主意。