свойство lateinit не инициализируется при восстановлении активности

В моей деятельности у меня есть свойство lateinit называемое controller которое использует мой Фрагмент. Это свойство инициализируется в Activity.onCreate() . Мой Fragment возвращает ссылку на мою Activity через onAttach() . Затем Fragment вызывает myActivity.controller в Fragment.onCreate() .

Обычно controller сначала инициализируется в Activity.onCreate() , после чего добавляется Fragment . Так что это работает отлично.

Но когда моя Activity была убита, она пытается воссоздать себя и свои фрагменты. Это вызывает вызов Fragment.onCreate() до инициализации в Activity.onCreate() .

Это варианты, которые я вижу прямо сейчас:

  • инициализировать controller до super.onCreate() (если это возможно)
  • переместите вызов myActivity.controller на последующий обратный вызов жизненного цикла, например onViewCreated()
  • что-то с ::controller.isInitialized доступно в Kotlin 1.2

Какой у меня лучший вариант?

Просмотрев жизненный цикл Fragment , на самом деле самым безопасным пунктом для этого будет #onActivityCreated(android.os.Bundle) .

Даже когда #onAttach() выглядит так, как он вызывается, когда Fragment привязан к Activity , я не уверен, что это полностью гарантировано, поскольку старый #onAttach(android.app.Activity) устарел, а новый #onAttach(android.content.Context) .

Лучший способ справиться с таким сценарием, когда объект используется перед инициализацией, – это проверить свойство isInitialized (), а затем использовать его.