小编moh*_*sen的帖子

kotlin延迟初始化属性不能在init块中修改

我的类中有一些属性是延迟初始化的。我希望它们是不可变的,这就是为什么我不使用它们lateinit,并且我不希望它们可以为空,所以我认为懒惰是最好的选择。

init我的类的块中,我想修改其中一个属性,但它给了我编译错误:Variable 'mLstQuestions' must be initialized
我知道惰性属性在使用后立即初始化,那么为什么会发生这种情况呢?我怎样才能解决这个问题?什么是更好的方法?

如果我创建一个函数Initialize()并在该函数中修改它。完全没问题,我可以在 init 块中调用它。为什么呢?这工作正常吗?有什么不同?如果在块中禁止执行类似的操作init,那么函数调用是否也应该被禁止?

这是我的代码:

class CharacterListView(
    inflater: LayoutInflater,
    parent: ViewGroup
) {
    init {
        mLstQuestions.adapter = mQuestionsListAdapter
        // error : Variable 'mLstQuestions' must be initialized
        // error : Variable 'mQuestionsListAdapter' must be initialized
    }
    
    private val mLstQuestions by lazy { findViewById<RecyclerView>(R.id.char_list) }
    private val mQuestionsListAdapter by lazy { QuestionsListAdapter(getContext(), this) }
    private val mRootView by lazy { inflater.inflate(R.layout.activity_main, parent, false) }
...
} …
Run Code Online (Sandbox Code Playgroud)

android constructor kotlin

2
推荐指数
1
解决办法
1316
查看次数

navGraph viewModel 的底层是如何工作的?

所以我的问题很简单。viewmodel 需要一个范围才能保持活力。例如活动或片段。所以我想一定有一个与 相关的类navgraph在多个片段中幸存下来。那么它是如何实现的呢?

val viewModel by navGraphViewModels(R.id.my_nav_graph).
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-viewmodel android-architecture-navigation

1
推荐指数
1
解决办法
687
查看次数