Модуль должен быть установлен

Я пытаюсь использовать новую вещь для инъекций Android Dagger, которая работает до сих пор.

Теперь я хочу расширить его до моих потребностей.

В моем MainActivityModule я добавил TestModule :

 @Module abstract class MainActivityModule { @ActivityScope @ContributesAndroidInjector(modules = arrayOf(TestModule::class)) internal abstract fun contributeMainActivityInjector(): MainActivity } 

TestModule действительно прост:

 @Module internal abstract class TestModule { @Provides internal fun provideTest(): String { return "foo bar" } } 

Но я получаю эту ошибку: TestModule must be set

Я заглянул в сгенерированный исходный код, но не могу найти подсказки, что мне нужно делать. Я тоже искал это в Google, но нашел только простые примеры 🙁

Что я забыл? Вы можете найти полное приложение в GitHub .

редактировать

Как сказал Джефф Боумен, securityTest provideTest() должен быть статичным. Когда я создаю класс Java следующим образом:

 @Module public class TestModule { @Provides static String provide() { return "foo bar"; } } 

оно работает.

Итак, последний вопрос: как это сделать в Котлине? Это не работает:

 @Module internal abstract class TestModule { companion object { @Provides @JvmStatic internal fun provideTest(): String { return "foo bar" } } } 

Поэтому мне нужен другой способ создания статического метода.

yeh Я нашел решение 🙂

Способ Kotlin для получения static метода заключается в том, чтобы поместить метод в companion object но теперь Dagger выдает ошибку, которую @Provides может использовать только в @Module . Чтобы исправить это, я тоже аннотировал companion object

 @Module internal abstract class TestModule { @Module companion object { @Provides @JvmStatic internal fun provideTest(): String { return "foo bar" } } } 

Альтернативное решение, это немного чище, если вам нужно издеваться / заменять зависимости в тестах, было бы избежать создания абстрактного класса и не предоставлять статические элементы, как это:

 @Module internal class TestModule { @Provides internal fun provideTest(): String { return "foo bar" } }