#android #kotlin
#Android #kotlin
Вопрос:
Модель данных
data class AuthDataModel @Inject constructor(
var username: String = "",
var password: String = "",
var mobileData: String = "
Объяснение
Я пытаюсь внедрить модель данных аутентификации в модель представления аутентификации в kotlin, но она не компилируется с сообщением («Типы могут содержать только один конструктор @Inject)
Комментарии:
1. IIRC
= ""
в основном конструкторе генерирует несколько конструкторов, указывающих на это. Однако декомпилируйте файл для проверки. Если это так, у вас должно быть 4 конструктора (пустой, имя пользователя, имя пользователя и пароль, имя пользователя, пароль и мобильные данные).2. @Zoe Спасибо. Я удалил значение по умолчанию для свойств, и это сработало.
Ответ №1:
Переношу мой комментарий к ответу:
Если у вас есть конструктор с аргументами по умолчанию, Kotlin фактически генерирует дополнительные конструкторы. В вашем случае у вас есть конструктор из 3 аргументов, где все они необязательны, который генерирует в общей сложности 4 конструктора. Kotlin, по-видимому, также связывает любые аннотации в основном конструкторе со всеми сгенерированными, что означает, что в итоге вы получили 4 @Inject
конструктора.
У вас есть два варианта:
Первый, как вы сами упомянули, удаляет все значения по умолчанию. Если значений по умолчанию нет, с аннотацией генерируется только один конструктор.
В качестве альтернативы, вы также можете самостоятельно создать дополнительные конструкторы и указать их на основной. Это также позволило бы вам вручную указать только один, который будет иметь @Inject
аннотацию, в то время как другие этого не делают. В основном:
data class AuthDataModel @Inject constructor(
var username: String,
var password: String,
var mobileData: String) {
constructor(username: String) : this(username, "", "") {}
constructor(username: String, password: String) : this(username, password, "") {}
}
Неиспользование значений по умолчанию предотвращает создание нескольких конструкторов @Inject, а вторичные конструкторы должны1 поддерживать все функционирование должным образом. По сути, это перегрузка конструктора, и это эквивалентно тому, что вы делаете в Java, когда определенные переменные являются необязательными. Поэтому все должно быть в порядке.
1: Я давно не делал Android и никогда не использовал @Inject. Если вариант 2 не работает (как в @Inject не разрешает это или работает не так, как ожидалось, и т.д.), Остается только вариант 1, и требуется, чтобы каждый параметр был передан явно. Однако вторичных конструкторов, вызывающих первичный конструктор, должно быть достаточно, чтобы все работало.
Комментарии:
1. Спасибо! Также не забудьте изменить все созданные объекты этого класса (поскольку изменился список параметров).