Типы могут содержать только один конструктор @Inject

#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. Спасибо! Также не забудьте изменить все созданные объекты этого класса (поскольку изменился список параметров).