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() }
不知怎的,我不认为这是一个好主意。
- Android体系结构组件:ViewModel在配置更改时返回null
- Android – SharedPreferences – 上下文
- Kotlingenericstypes,types推断失败
- 使用Kapt和Dagger2进行注释处理时出错
- Kotlin:以函数的forms传递对象作为参考,并改变它的实例
- java.lang.NoClassDefFoundError:kotlin.jvm.internal.Intrinsics – newApplication
- 移除Firebase侦听器不适用于Android
- 找不到类“kotlin.jvm.internal.DefaultConstructorMarker”
- 匕首2不能从子组件(kotlin)注入