Подтвердить что ты не робот

Используйте модули Dagger без директивы "инъекций"

Я пытаюсь заставить Кинжал работать без директивы "вводит" внутри аннотации @Module. Я основываю свой тестовый проект на Android Simple Dagger example

Это часть, которая дает мне проблемы:

@Module(
    injects = HomeActivity.class,
    complete = false
)
public class DemoModule {
  // TODO put your application-specific providers here!
}

(Edit): что в моем коде CTXModules.java

Часть, которую я хочу удалить, - это "injects = HomeActivity.class". Я знаю, что могу пометить свои собственные модули с помощью аннотации @Inject в конструкторе, чтобы удалить эту часть там, но каким-то образом она не работает с модулем, который добавлен в график. С этой линией все работает отлично.

Причина, по которой мне это нужно, - это то, что кинжал будет реализован в проекте базовой библиотеки, который станет основой для некоторых проектов, которые используют общую базу кода, и поэтому на данный момент или написания этой части кода, t знать, какие классы будут вводить модули.

Я пытаюсь сделать то, что я пытаюсь сделать?

Я предполагаю, что это возможно, потому что класс Android-модуля не использует эту директиву.

Надеюсь, что это достаточно ясно. Спасибо заранее!

(РЕДАКТИРОВАТЬ)

Я должен был упомянуть об этом. В моем модуле я удаляю "injects = HomeActivity.class" и добавляю "library = true", как в класс модуля Android. Тогда происходит то, что я получаю эту ошибку (мой плохой я еще не добавил):

12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main
12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783
12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Looper.loop(Looper.java:137)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.main(ActivityThread.java:4998)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invoke(Method.java:515)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dalvik.system.NativeStart.main(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783): Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:281)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:258)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MyApplication.inject(MyApplication.java:47)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.BaseActivity.onCreate(BaseActivity.java:27)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MainActivity.onCreate(MainActivity.java:16)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Activity.performCreate(Activity.java:5243)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-10 09:21:16.807: E/AndroidRuntime(21783):    ... 11 more

Кроме того, я загрузил мой тестовый проект в github

(Final Edit) в соответствии с ответом Джейка: "Объявление модуля как библиотеки не облегчает потребности кинжалов, чтобы знать о точках инъекции". И поэтому ответ на мой первоначальный вопрос заключается в том, что это невозможно.

4b9b3361

Ответ 1

Вы хотите

@Module(library=true)

Вот что говорят docs о library:

False, если все включенные привязки в этом модуле необходимы для удовлетворения всех его типов инъекций. Если модуль не является библиотечным модулем, он имеет право на дополнительную статическую проверку: инструменты могут определять, не включены ли привязки. Если вы предоставляете привязки, которые не используются этим графиком модуля, тогда вы должны объявить библиотеку = true.

(акцент мой)


Объявление модуля как библиотеки не облегчает потребности кинжалов, чтобы знать о точках инъекции. Вы все еще должны объявить модуль в графе объектов с указанными инъекциями.

Крайне упрощенная версия вашего примера будет выглядеть так:

repo/
 +- library/
 |   +- Foo.java
 |   `- FooModule.java
 |
 `- app/
     +- BarActivity.java
     `- BarModule.java

FooModule.java:

@Module(library = true)
public final class FooModule {
  @Provides @Singleton provideFoo() {
    return Foo();
  }
}

BarModule.java:

@Module(
  injects = BarActivity.class,
  includes = FooModule.class
)
public final class BarModule {
}

В BarActivity.java (или аналогичном):

ObjectGraph og = ObjectGraph.create(new BarModule());
og.inject(this);