Внедрение конструкции кинжала с делегированием класса 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 не должен предоставлять внутренние / скрытые типы,
- и / или Котлин не должен использовать эти скрытые типы