2016-05-16 26 views
5

मैं डैगर के लिए नया हूं और मेरा कन्स्ट्रक्टर/विधि इंजेक्शन काम नहीं कर रहा है। काम नहीं करता है कि इंजेक्शन वाले फ़ील्ड अभी भी अनुरोध किए गए हैं।एंड्रॉइड: डैगर 2 और कन्स्ट्रक्टर इंजेक्शन

@Module 
public class AppContextModule { 

    private final Context appContext; 

    public AppContextModule(Context appContext) { 
     this.appContext = appContext; 
    } 

    @Singleton 
    @Provides 
    public Context getAppContext() { 
     return appContext; 
    } 

} 

@Singleton 
@Component(modules = {AppContextModule.class}) 
public interface MyComponent { 

    void inject(ActivitiesLifeCycleListener obj); 

    void inject(WebViewManager obj); 

    Context context(); 

} 

public final class MyClass { 

    private final WeakReference<Context> mAppContext; 

    @Inject 
    public MyClass(Context context) { 
     this.mAppContext = context 
    } 

} 

public class MyActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     MyClass my = new MyClass(); // The IDE requests context! 

    } 

} 

"MyClass" अभी भी "प्रसंग" की आवश्यकता है, हालांकि मैं निर्माता के ऊपर "@Inject" एनोटेशन प्रयोग किया है:

यह मेरा कोड है। मुझे क्या याद आ रही है?

क्या मुझे अपने संदर्भ का खुलासा करने की भी आवश्यकता है?

धन्यवाद।

+0

यदि आप उदाहरण 'MyClass my = new MyClass(); उदाहरण बनाना चाहते हैं तो @inject का क्या मतलब है? –

उत्तर

10

खैर ... आप अपने निर्माता की घोषणा

public MyClass(Context context) { 
    this.mAppContext = context 
} 

और फिर कोई पैरामीटर

MyClass my = new MyClass(); // The IDE requests context! 

बिना इसे कहते क्यों आपको लगता है कि यह काम होना चाहिए था? यह सादा जावा है, कोई डैगर शामिल नहीं है, और आप आवश्यक तर्कों की आपूर्ति किए बिना कुछ नया ऑब्जेक्ट बनाने की कोशिश कर रहे हैं।


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

public class MyActivity extends BaseActivity { 

    @Inject 
    MyClass mMyClass; // mark field for injection 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // todo ... create component 

     component.inject(this); // inject fields 
    } 

} 

यह देखते हुए कि आप एक Context कहीं प्रदान (अगर यह नहीं है कि आप एक Context must be provided... संकलन त्रुटि प्राप्त होगी) कटार तो बुलाinject — कोई जादू द्वारा MyClass साथ अपनी गतिविधि इंजेक्षन जाएगा। inject विधि ऑब्जेक्ट को आपके फ़ील्ड को असाइन करेगा।


निर्माता इंजेक्शन केवल मतलब है कि आप एक मॉड्यूल का उपयोग करने की जरूरत नहीं है कि और वस्तु प्रदान करने के लिए एक विधि शामिल हैं। यह न केवल जादुई रूप से पतली हवा से वस्तुओं को बनाते हैं या रचनाकारों के काम को बदलने के तरीके को बदलते हैं।

+0

क्या आप इस विषय पर मेरी सहायता कर सकते हैं http://stackoverflow.com/q/43308649/6596724, धन्यवाद –

+0

बहुत अच्छा होगा अगर आपने दिखाया था कि कक्षा के लिए घटक कैसे बनाना है जो मॉड्यूल नहीं है। –

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