2013-12-09 56 views
17

我想讓匕首在@Module註釋中沒有「注入」指令的情況下工作。我立足我的測試項目上Android Simple Dagger example使用沒有「注入」指令的匕首模塊

這是給我的問題的一部分:

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

(編輯):這在我的代碼是CTXModules.java

的一部分,我會喜歡刪除是「injects = HomeActivity.class」。我知道我可以用構造函數中的@Inject註釋標記我自己的模塊,以刪除那裏的那部分,但不知何故它不能與添加到圖形中的模塊一起工作。有了那條線,一切正常。

我需要這個的原因是因爲匕首將在一個基礎庫項目中實現,該基礎項目將成爲一些共享通用代碼庫的項目的基礎,因此目前還是編寫代碼的這一部分不知道哪些類將注入模塊。

我試圖做甚至可能嗎?

我認爲這是可能的,因爲Android Module class不使用該指令。

希望它很清楚。提前致謝!

(編輯)

我應該提到它。在我的模塊中,我刪除「injects = HomeActivity.class」並添加「庫= true」,如Android Module class。會發生什麼事則是,我得到這個錯誤(我的壞我之前沒有添加的話):根據傑克的答案

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 

而且,我已經上傳my test project to github

(決賽編輯):「聲明一個模塊因爲圖書館不能減輕Dagger對注射點的瞭解。「因此,我原來的問題的答案是,這是不可能的。

回答

24

你想

@Module(library=true) 

這裏的文檔說怎麼樣library

假,如果所有在此模塊中包含的綁定是必要的,以滿足其所有的注射類型。如果一個模塊不是一個庫模塊,它有資格進行額外的靜態檢查:工具可以檢測到包含的綁定是否必要。 如果您提供了該模塊圖表未使用的綁定,那麼您必須聲明library = 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); 
+0

謝謝傑克,我已經嘗試過,仍然無法正常工作。我的壞我沒有指定它。我用更多的相關信息編輯了我的問題,並且我已經將我的測試項目添加到github中,並且鏈接到了我提到的類。 – spCoder

+1

我已經更新了我的答案,以顯示庫模塊的下游使用情況。你仍然需要告訴Dagger關於「注入」的地方,以便能夠注入。 –

+2

正如你在編輯開始時指定的那樣:「將模塊聲明爲庫並不能減輕Dagger瞭解注入點的需求。」 因此,我原來的問題的答案是,這是不可能的。 謝謝傑克! – spCoder