Внедрение конструкции кинжала с делегированием класса Kotlin

У меня есть следующий класс Kotlin:

@ExperimentalCoroutinesApi
class SharedPrefClient 
    @Inject constructor(private val prefs: SharedPreferences) 
      : SharedPreferences by prefs {

   ...

}

В Dagger я получаю следующую ошибку при сборке проекта:

ht tps:https://stackru.com/images/8778248a7de54f5c31db5b635ff9f9c74e16113f.png

Но это работает, когда я удаляю делегирование класса : SharedPreferences by prefs

Теперь мой вопрос: как я могу использовать Dagger и Kotlin Class Delegation одновременно.

1 ответ

Мне кажется, что проблема в android.annotation.Nullable который втягивается в ваш код с помощью by ключевое слово, но недоступное извне из исходного кода Android.

Обычно вы увидите ошибку напрямую, если тип не может быть разрешен, но в этом случае Kotlin генерирует код Java с неизвестной аннотацией, а Dagger пытается обработать это, что приводит к вашей ошибке.

Если вы создадите свой собственный интерфейс, отличный от SharedPreferences он будет работать нормально, как и следовало ожидать.

Вы могли бы добавить android.annotation.Nullable к вашему (только для компиляции) пути к классам, чтобы Dagger мог делать свое дело, но, вероятно, проще найти другой способ.


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

  • Кинжал должен быть лучше. В этом случае сообщение об ошибке не поможет.
  • Android не должен предоставлять внутренние / скрытые типы,
  • и / или Котлин не должен использовать эти скрытые типы
Другие вопросы по тегам