我试图使Dagger在@Module批注内没有“ injects”指令的情况下工作。我将测试项目基于Android Simple Dagger示例
这是给我带来问题的部分:
@Module( injects = HomeActivity.class, complete = false ) public class DemoModule { // TODO put your application-specific providers here! }
(编辑):在我的代码中是CTXModules.java
我要删除的部分是“ injects = HomeActivity.class”。我知道我可以在构造函数中使用@Inject批注标记自己的模块,以在那里删除该部分,但是以某种方式,它不适用于添加到图中的模块。有了那条线,一切都很好。
我之所以需要它,是因为匕首将在基础库项目中实现,而基础库项目将成为某些共享公共代码库的项目的基础,因此,目前或编写这部分代码我都不知道类将注入模块。
我尝试做的事情甚至可能吗?
我认为这是可能的,因为Android Module类不使用该指令。
希望它足够清楚。提前致谢!
(编辑)
我应该提到它。在我的模块中,像在Android Module类中一样,删除“ injects = HomeActivity.class”并添加“ library = true” 。然后发生的是我收到此错误(我不好,我之前没有添加过):
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
(最终编辑)根据Jake的回答:“将模块声明为库并不能减轻Dagger了解注入点的需求。” 因此,我最初的问题的答案是不可能的。
你要
@Module(library=true)
这是文档所说的library:
library
如果此模块中所有包含的绑定对于满足其所有可注入类型都是必需的,则为False。如果模块不是库模块,则可以进行其他静态检查:工具可以检测是否不需要包含的绑定。 如果您提供此模块图未使用的绑定,则必须声明library = true。
(强调我的)
将模块声明为库并不能减轻Dagger了解注入点的需求。您仍然必须在对象图中使用列出的注入声明一个模块。
您的示例的极端简化版本如下所示:
repo/ +- library/ | +- Foo.java | `- FooModule.java | `- app/ +- BarActivity.java `- BarModule.java
FooModule.java:
FooModule.java
@Module(library = true) public final class FooModule { @Provides @Singleton provideFoo() { return Foo(); } }
BarModule.java:
BarModule.java
@Module( injects = BarActivity.class, includes = FooModule.class ) public final class BarModule { }
在BarActivity.java(或类似)中:
BarActivity.java
ObjectGraph og = ObjectGraph.create(new BarModule()); og.inject(this);