Фрагмент 1.3.0 представил метод view.findViewTreeLifecycleOwner() для получения владельца жизненного цикла представления. Во фрагменте этот метод возвращает значение null перед onViewCreated().
Мне нужно выполнить некоторую инициализацию в пользовательском представлении с использованием сопрограмм, поэтому мне нужно вызвать findViewTreeLifecycleOwner().lifecycleScope, чтобы получить область действия сопрограммы. Как лучше всего вызывать его в представлении?
Сначала я попытался вызвать его в конструкторе, так как он создан для инициализации, но он вызывается перед onViewCreated() фрагмента, поэтому метод возвращает значение null.
Поэтому я попытался поместить его в onAttachedToWindow(), и там это работает, но я действительно не знаю, хорошая ли это идея - делать инициализацию здесь.
class TestView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) {
init {
// return null here as constructor is called before fragment's onViewCreated()
findViewTreeLifecycleOwner()!!.lifecycleScope.launchWhenStarted {
...
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
// here it works because it's called after fragment's onViewCreated()
findViewTreeLifecycleOwner()!!.lifecycleScope.launchWhenStarted {
...
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/661 ... ustom-view