2013-12-09 13 views
17

मैं @ मॉड्यूल एनोटेशन के अंदर "इंजेक्शन" निर्देश के बिना डैगर काम करने की कोशिश कर रहा हूं।"इंजेक्शन" निर्देश के बिना डैगर मॉड्यूल का उपयोग करें

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

(संपादित):: जो मेरी कोड में CTXModules.java

बात यह है कि मैं होता है मैं Android Simple Dagger example

इस पर अपने परीक्षण परियोजना आधारित हूँ हिस्सा है कि मुझे समस्याओं दे रही है निकालने की तरह "इंजेक्शन = होमएक्टिविटी.क्लास" है। मुझे पता है कि मैं उस भाग को हटाने के लिए कन्स्ट्रक्टर में @ इंजेक्शन एनोटेशन के साथ अपने मॉड्यूल को चिह्नित कर सकता हूं, लेकिन किसी भी तरह से यह ग्राफ में जोड़े गए मॉड्यूल के साथ काम नहीं करता है। उस रेखा के साथ, सब कुछ ठीक काम करता है।

कारण मुझे इसकी आवश्यकता है क्योंकि डैगर को बेस-लाइब्रेरी प्रोजेक्ट में लागू किया जाएगा जो कुछ परियोजनाओं के लिए आधार होगा जो एक सामान्य कोड बेस साझा करते हैं और इसलिए इस समय कोड के इस हिस्से को लिखते हैं या लिखते हैं यह नहीं पता कि कक्षाएं मॉड्यूल को इंजेक्ट करेगी।

क्या मैं भी ऐसा करने की कोशिश कर रहा हूं?

मुझे लगता है कि यह संभव है क्योंकि Android Module class उस निर्देश का उपयोग नहीं करता है।

आशा है कि यह पर्याप्त स्पष्ट है। अग्रिम में धन्यवाद!

(EDIT)

मुझे इसका उल्लेख करना चाहिए था। मेरे मॉड्यूल में मैं "इंजेक्शन = होमएक्टिविटी.क्लास" को हटाता हूं और 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

(अंतिम संपादित करें) अपलोड कर दिया जेक के जवाब के अनुसार: "एक मॉड्यूल की घोषणा क्या तब होता है कि मैं इस त्रुटि मिलती है (मेरा बुरा मैंने पहले नहीं जोड़ा यह) है क्योंकि लाइब्रेरी इंजेक्शन पॉइंट्स के बारे में जानने के लिए डैगर की ज़रूरतों को कम नहीं करती है। " और इसलिए मेरे मूल प्रश्न का उत्तर यह है कि यह संभव नहीं है।

उत्तर

24

आप

@Module(library=true) 

यहाँ डॉक्स क्या कहना है चाहते हैं के बारे library:

झूठी यदि इस मॉड्यूल में सभी शामिल बाइंडिंग अपने इंजेक्शन प्रकार के सभी को पूरा करने के लिए आवश्यक हैं। यदि कोई मॉड्यूल लाइब्रेरी मॉड्यूल नहीं है, तो यह अतिरिक्त स्थैतिक जांच के लिए योग्य है: उपकरण शामिल हो सकते हैं यदि बाइंडिंग शामिल नहीं है। यदि आप बाइंडिंग प्रदान करते हैं जिनका उपयोग इस मॉड्यूल के ग्राफ द्वारा नहीं किया जाता है, तो आपको लाइब्रेरी = सत्य घोषित करना होगा।

(जोर मेरा)


एक मॉड्यूल एक पुस्तकालय डैगर की जरूरतों को कम नहीं करता है के रूप में इंजेक्शन अंक के बारे में पता करने के लिए की घोषणा। आपको अभी भी सूचीबद्ध इंजेक्शन के साथ ऑब्जेक्ट ग्राफ़ में एक मॉड्यूल घोषित करना होगा।

अपने उदाहरण के एक चरम सरलीकृत संस्करण इस प्रकार दिखाई देगा:

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

धन्यवाद जेक, मैंने पहले ही कोशिश की है और अभी भी काम नहीं कर रहा है। मेरा बुरा मैंने इसे निर्दिष्ट नहीं किया। मैंने अपने प्रश्न को और अधिक प्रासंगिक जानकारी के साथ संपादित किया है और मैंने अपनी टेस्ट प्रोजेक्ट जिथब और मेरे द्वारा उल्लिखित कक्षाओं के कुछ लिंक जोड़े हैं। – spCoder

+1

मैंने लाइब्रेरी मॉड्यूल की डाउनस्ट्रीम खपत दिखाने के लिए अपना जवाब अपडेट कर दिया है। इंजेक्ट करने में सक्षम होने के लिए आपको अभी भी 'इंजेक्ट्स' के बारे में डैगर को बताना होगा। –

+2

इसलिए जैसा कि आपने अपने संपादन की शुरुआत में निर्दिष्ट किया है: "पुस्तकालय के रूप में एक मॉड्यूल घोषित करना इंजेक्शन बिंदुओं के बारे में जानने के लिए डैगर की आवश्यकताओं को कम नहीं करता है।" और इसलिए मेरे मूल प्रश्न का उत्तर यह है कि यह संभव नहीं है। धन्यवाद जेक! – spCoder

संबंधित मुद्दे