WedX - журнал о программировании и компьютерных науках

Kotlin lateInit не был инициализирован из-за ошибки приложения

У меня есть фрагмент приложения Android Kotlin с тремя элементами в макете ресурса:

<EditText android:id="@+id/forename_input_account"/>
<EditText android:id="@+id/surname_input_account"/>
<Button android:id="@+id/saveButton"/>

При нажатии кнопки «Сохранить» мне требуется, чтобы содержимое двух полей EditText было записано в проект Firebase Realtime DB.

В файле фрагмента аккаунта у меня есть следующее:

class AccountFragment : Fragment() {

    lateinit var forename_input_account: EditText
    lateinit var surname_input_account: EditText
    lateinit var saveButton: Button

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

            forename_input_account = forename_input_account
            surname_input_account = surname_input_account
            saveButton = saveButton

            saveButton.setOnClickListener {
                saveAccount()
            }

    }

    private fun saveAccount(){
        val firstname = forename_input_account.text.toString().trim()
        val lastname = lastname_input_account.text.toString().trim()

        val ref = FirebaseDatabase.getInstance().getReference("mySaveLocation")
        val saveId = ref.push().key

        val myRecord = save(saveId, firstname, lastname)

        ref.child(saveId.toString()).setValue(myRecord).addOnCompleteListener{

        }
    }

}

имя и фамилия объявляются в отдельном файле следующим образом:

class Hero(val id: String?, val firstname: String, val lastname: String)

Когда я запускаю приложение и перехожу к фрагменту, приложение вылетает со следующей ошибкой:

kotlin.UninitializedPropertyAccessException: свойство lateinit forename_input_account не было инициализировано



Ответы:


1

forename_input_account = forename_input_account устанавливает forename_input_account себе. Это не имеет практического эффекта, и поскольку вы пытаетесь получить доступ к lateinit var, прежде чем присвоить ему значение, происходит сбой.

Если вы пытаетесь использовать синтетические свойства котлина, удалите три свойства lateinit var и просто используйте синтетические свойства Kotlin с привязкой к завышенному view.

В противном случае вам нужно использовать findViewById() или что-то еще, чтобы View назначался этим свойствам lateinit var (например, forename_input_account = view.findViewById(R.id.forename_input_account)).

04.08.2019
  • Это не имеет никакого эффекта. Обычно да, но вот оно: выброс исключения. 04.08.2019
  • @AlexeyRomanov: Спасибо за отзыв! Я попытался прояснить свою точку зрения. 04.08.2019

  • 2

    Вы можете добавить onCreateView и установить внутри него макет

    fun onCreateView(inflater: LayoutInflater, @Nullable container: ViewGroup, @Nullable savedInstanceState: Bundle): View {
    
        return inflater.inflate(R.layout.example, container, false)
    }
    
    04.08.2019
  • OK. Где бы вы сделали это вместо этого? Спасибо 04.08.2019
  • Я добавил раствор. Спасибо 05.08.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]