2015-01-27 15 views
36

मुझे यह समझने में कोई समस्या है कि निम्न कोड क्यों काम नहीं करता है।घटक निर्भरताओं का उपयोग करते समय सिंगलेट्स के साथ समस्याएं

मैं निम्नलिखित है परियोजना संरचना:

@Component(modules = CCModule.class) 
public interface CComponent { 
    XXX getXXX(); 
} 

जहां

@Module 
public class CCModule { 

    @Provides @Singleton 
    public XXX provide XXX(){ 
     return new XXX(); 
    } 
} 

और

@Component(dependencies = CComponent.class, modules = AAModule.class) 
public interface AComponent { 
    YYY getYYY(); 
} 

जहां

class YYY { 
    @Inject 
    public YYY(XXX xxx) { 
     ... 
    } 
} 
,210

मैं प्रारंभ सब कुछ के रूप में:

CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build(); 

AComponent a_component = Dagger_AComponent.builder() 
     .cComponent(c_component) 
     .aAModule(new AAModule()) 
     .build(); 

एक बार संकलन जगह मैं निम्नलिखित त्रुटि मिलती है लेता है:

Error:(11, 1) error: com.test.CComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()

क्या मैं के लिए लक्ष्य कर रहा हूँ एक घटक अन्य घटकों से बाइंडिंग के वारिस है करने के लिए है एक वस्तु (सिंगलेट्स) के लिए एक ही संदर्भ।

उत्तर

81

आपको @Singleton से CComponent कक्षा घोषणा करना चाहिए।

@Singleton 
@Component(modules = CCModule.class) 
public interface CComponent { 
    XXX getXXX(); 
} 

स्पष्टीकरण त्रुटि संदेश में है: CComponent unscoped है, @Singleton एक गुंजाइश है। डैगर 2 स्कॉप्ड बाइंडिंग के साथ मॉड्यूल का उपयोग करने के लिए असुरक्षित घटकों को अनुमति नहीं देता है।
हालांकि, अब आपको निम्न त्रुटि प्राप्त होगा:

AComponent (unscoped) cannot depend on scoped components: 
@Component(dependencies = CComponent.class, modules = AModule.class) 

Unscoped घटकों scoped निर्भरता नहीं हो सकता। तो आपको AComponent स्कॉप्ड करने की आवश्यकता है। ऐसा करने के लिए कस्टम AScope एनोटेशन बनाएं।

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AScope { 
} 

और यह AComponent के साथ उनकी व्याख्या:

@AScope 
@Component(dependencies = CComponent.class, modules = AModule.class) 
public interface AComponent { 
} 

इन नए आवश्यकताओं नवीनतम snapshot release में दिखाई दिया है। इस पर issue में चर्चा की गई थी और अभी भी बदला जा सकता है।

+0

साथ unscoped घटकों का उपयोग करने की अनुमति नहीं @ अलेक्जेंडर वासिलिजेव ने नवीनतम स्नैपशॉट पर परीक्षण किया। ठीक काम करता है =)। कस्टम 'एस्कोप' एनोटेशन के साथ मेरा जवाब थोड़ा सा अपडेट किया गया। आपके कोड के साथ कुछ सही नहीं है। इसे दिखाना। वैसे, चलिए अंग्रेजी में बात करते हैं, यह रूसी संसाधन नहीं है। –

+0

स्वच्छ समाधान महोदय –

0

घटक के लिए

@Singleton 
@Component(modules = {NameModule.class}) 
public interface NameComponent { 

} 

जोड़े क्योंकि dagger2 scoped मॉड्यूल

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