Класс отсутствует конструктор без аргументов, но я предоставил конструктор без аргументов

Я пытаюсь получить информацию о пользователе после входа в систему Firebase. У меня есть подозрение, что эта ошибка на самом деле не моя проблема – и приходится иметь дело с тем, что я использую ServerValue.Timestamp для хранения даты / времени для пользователя, когда они зарегистрировались (поскольку я пытаюсь вытащить dateJoined назад, и мой класс не знает, что с ним делать). Моя база данных выглядит примерно так:

введите описание изображения здесь

И при входе в систему, это код, который я использую для захвата информации пользователя

 //grab user's name from firebase //drill down to specific user val usersRef = FirebaseDatabase.getInstance().getReference("Users") val loggedInUserRef = usersRef.child(user.uid) //specific to the logged in user val dataRef = loggedInUserRef.child("UserInfo") //get logged in user info //attach listener dataRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { // Get Post object and use the values to update the UI val user_data = dataSnapshot.getValue(User::class.java) Log.w(TAG, dataSnapshot.value.toString()) //add relevant data to shared preferences prefs.userName = "$user_data.FirstName $user_data.LastName" } override fun onCancelled(databaseError: DatabaseError) {} }) 

И у меня есть класс User в отдельном файле:

 package androidproject.project_rc data class User( var FirstName: String = "", var LastName: String = "", var Email: String = "", var Password: String = "", var DateJoined: Any ) 

Вокруг этой строки: val user_data = dataSnapshot.getValue(User::class.java) , где возникает ошибка: что дает?

Взгляните на Документы

При использовании getter.getValue (класса) класс должен иметь конструктор аргументов 0.

К сожалению, вы не можете использовать класс данных для этого пути. Просто перепишите свой класс как

 class User(){ var firstName: String = "" var lastName: String = "" var email: String = "" var password: String = "" var dateJoined: Long = 0L } 

Возможно, вы захотите использовать имена переменных нижнего регистра, поскольку это соглашение. Кроме того, вы можете избежать Any для dateJoined, поскольку я предполагаю, что это временная метка UTC.

Затем firebase sdk проверяет каждый ключ базы данных, если для этого имени существует сеттер / общедоступное поле, и если да, установите его. Kotlin автоматически генерирует сеттеры и геттеры, поэтому вам нужно только удостовериться, что члены называются такими же, как ключи в вашей базе данных.

Несмотря на то, что один из разработчиков однажды сказал (и это, похоже, не отображается в документах), что sdk попытается получить доступ к нескольким стилям имен. Это довольно расплывчато, поэтому лучше не забудьте сопоставить ключи базы данных.

Не уверен в Kotlin (никогда не использовал его), но я думаю, что имена полей pojo должны совпадать с именем записи Firebase

как:

var Пароль: String = "",

имеет столицу «P», но в вашей Firebase «Пароль» пишется с нижним регистром.

Если все параметры основного конструктора имеют значения по умолчанию, Kotlin также сгенерирует конструктор без параметров. В вашем случае DateJoined отсутствует один. Так

 data class User( var FirstName: String = "", var LastName: String = "", var Email: String = "", var Password: String = "", var DateJoined: ... = ... ) 

(Я не знаю, какие типы разрешены для полей в FireBase, но Any вероятно, не один, и если он не может быть эффективным.)

Intereting Posts