2015-05-30 8 views
11

मैं निम्नलिखित सरल मॉड्यूल है:संदर्भ @ प्रोविड-एनोटेटेड विधि के बिना प्रदान नहीं किया जा सकता है, लेकिन यह है?

@Module 
public class ApplicationModule { 

    private CustomApplication customApplication; 

    public ApplicationModule(CustomApplication customApplication) { 
     this.customApplication = customApplication; 
    } 

    @Provides @Singleton CustomApplication provideCustomApplication() { 
     return this.customApplication; 
    } 

    @Provides @Singleton @ForApplication Context provideApplicationContext() { 
     return this.customApplication; 
    } 

} 

और संबंधित सरल घटक:

@Singleton 
@Component(
     modules = ApplicationModule.class 
) 
public interface ApplicationComponent { 

    CustomApplication getCustomApplication(); 

    Context getApplicationContext(); 

} 

और मैं घटक यहाँ बना रहा हूं:

public class CustomApplication extends Application { 

    ... 

    private ApplicationComponent component; 

    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     MultiDex.install(this); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     component = DaggerApplicationComponent.builder() 
       .applicationModule(new ApplicationModule(this)) 
       .build(); 

यह इस त्रुटि फेंकता संकलन समय: Error:(22, 13) error: android.content.Context cannot be provided without an @Provides-annotated method, लेकिन जैसा कि आप देख सकते हैं कि यह @Provides के साथ एनोटेट किया गया है।

यह वास्तव में अजीब बात है क्योंकि जब मैं क्वालीफायर एनोटेशन बंद करता हूं तो समस्या दूर हो जाती है।

@Qualifier @Retention(RUNTIME) 
public @interface ForApplication { 
} 

यह व्यावहारिक रूप से एक पाठ्यपुस्तक Dagger2 उदाहरण है:

शायद ज़रुरत पड़े, यह मेरा @ForApplication क्वालीफायर है। मैं क्या गलत कर रहा हूं?

उत्तर

21

परीक्षण और त्रुटि के थोड़ी देर बाद मुझे कारण मिल गया है, यह Context की अस्पष्टता है क्योंकि @ForApplication कुछ स्थानों में अनुपलब्ध है जहां Context आवश्यक है।

इस समय यह डैगर 2 की मेरी कमजोर समझ हो सकती है, लेकिन यह बॉयलरप्लेट डेवलपर त्रुटियों के लिए काफी प्रवण है।

किसी भी तरह ... कि समस्या आप बस हर जगह में क्वालीफायर टिप्पणियां जोड़ने के लिए है कि निर्भरता प्रयोग किया जाता है है पाता है किसी के लिए: यहाँ

@Singleton 
@Component(
     modules = ApplicationModule.class 
) 
public interface ApplicationComponent { 

    CustomApplication getCustomApplication(); 

    @ForApplication Context getApplicationContext(); 

} 
+0

एक ही मुद्दा। मुझे अपने कन्स्ट्रक्टर को '@ ForAplication' जोड़ना पड़ा: '@ MyThing इंजेक्ट करें (@ForAplication संदर्भ संदर्भ) {this.context = context; } ' – anon

+0

यह समझ में नहीं आता है। आप वास्तव में कहां से 'getAplicationContext() 'कह रहे हैं ?? –

+0

क्या आप विस्तार से बता सकते हैं कि वास्तव में क्या समझ में नहीं आता है? मैं उस विधि को नहीं बुला रहा हूं, यह केवल डैगर 2 घटक के लिए एक घोषणा है। मैं बस इतना कह रहा हूं कि उस दायरे में 'संदर्भ' की घोषणा में एनोटेशन गायब था। यही कारण है कि मुझे त्रुटि मिल रही थी, क्योंकि मेरे मॉड्यूल ने निर्दिष्ट किया था कि प्रदत्त संदर्भ '@ ForAplication 'था और मेरा घटक नहीं था। – Eddnav

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

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