Intereting Posts
Kotlin: Почему я не могу выполнить задание в защитнике цикла? Как сделать активность размытой, когда она идет фон? Android Studio 2.3.2 и Kotlin 1.1.2-4 + привязка данных Игнорирование определенных свойств при генерации equals (), hashCode () и т. Д. Как ссылаться на экземпляр внешнего класса в Котлине? Дублирующие элементы в наборе Как функции хранения в статической коллекции будут влиять на систему? Android Retrofit Получить запрос в кодировке Kotlin: Как я могу избежать автобоксинга (мусора) в делегированных свойствах? Как запустить метод suspend посредством отражения? Преобразование наблюдаемого в текущее с противодавлением в RxJava2 Дооснащение – пропустите два параметра Kotlin: доступ к вложенному классу enum из java Генератор последовательности как вызов функции расширения не работает с «несоответствием типа приемника», Не удалось запустить программу Kotlin в терминале

свойство 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 (), а затем использовать его.