2016-03-23 19 views
6

के साथ निर्भरता इंजेक्शन देखें मेरे पास एक कस्टम दृश्य है TextView। दृश्य को इंजेक्ट करने के लिए मुझे अपने घटक को कहां कॉल करना चाहिए?डैगर 2

component.inject(customTextView); 

उत्तर

5

तो, मुझे पता है कि मैं अपने कस्टम देखने के निर्माता में इंजेक्शन जोड़ने (उन सभी को, या एक अन्य फोन करना) करने की जरूरत है

उदाहरण:

public class CustomTextView extends TextView { 
    @Inject 
    AnyProvider anyProvider; 

    public CustomTextView(Context context) { this(context, null); } 
    public CustomTextView(Context AttributeSet attrs) { 
     super(context, attrs); 
     Application.getComponent(context).inject(this); 
    } 
} 
+2

क्या आप डगर 2.11 का उपयोग कर रहे हैं? क्या आप मुझे दिखा सकते हैं कि इसे प्राप्त करने के लिए: Application.getComponent (संदर्भ)? एंड्रॉइड इंजेक्टर के अलावा मेरा एप्लिकेशन कुछ भी वापस नहीं कर सकता है। धन्यवाद। – GuilhE

+0

आपका 'एप्लिकेशन कॉम्पोनेंट' - 'applicationInjector() 'द्वारा लौटाया गया -' एंड्रॉइड इंजेक्टर 'का विस्तार करना चाहिए, इसलिए इसे' ApplicationComponent 'पर डाला जा सकता है। मुझे एक संकलक चेतावनी मिली है जो मुझे यह स्पष्ट करने के लिए 'ApplicationComponent.builder.build()' के रिटर्न प्रकार को ओवरराइड करने के लिए कह रही है। संभवतः 'applicationInjector()' को कई बार कॉल करना अच्छा नहीं है क्योंकि यह कई बार घटक बनायेगा, इसलिए मैं इसका संदर्भ संग्रहीत कर रहा हूं ... सुनिश्चित नहीं है कि यह सर्वोत्तम अभ्यास है या नहीं। शायद एक नए सवाल में फॉलो अप करें। – NeilS

+0

@ गुइली ... इसका उपयोग करें, यह रिटर्न डैगर घटक daggerAppComponent = DaggerAppComponent.builder()। एप्लिकेशन (यह) .build(); –

3

बात उस तरह के लिए मेरा सामान्य समाधान इस

public class WelcomeView 
     extends LinearLayout { 
    private static final String TAG = "WelcomeView"; 

    public WelcomeView(Context context) { 
     super(context); 
     init(context); 
    } 

    public WelcomeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 

    @TargetApi(21) 
    public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(context); 
    } 

    private void init(Context context) { 
     if(!isInEditMode()) { 
      Application.getComponent(context).inject(this); 
     } 
    } 
+0

आप इसे एक कन्स्ट्रक्टर कॉल करने के लिए इस() का उपयोग कर सकते हैं, इसलिए आपको अपने सभी कन्स्ट्रक्टर –

+0

में इनिट जोड़ने की आवश्यकता नहीं है, लेकिन मुझे यह सुनिश्चित करना अच्छा लगता है कि यह मेरे सभी रचनाकारों से कहलाता है, अगर एंड्रॉइड कुछ करता है अजीब :) – EpicPandaForce

+0

स्थिरता इंजेक्शन के मुख्य बिंदुओं में से एक स्थिर विधियों से छुटकारा नहीं मिल रहा है? लेकिन आप अभी भी एक स्थिर विधि बुला रहे हैं। गतिविधि और खंड में मुझे पता है कि इससे कैसे बचें लेकिन विचारों के बारे में क्या? – kingston

2

अद्यतन है: डैगर के 2.10 संस्करण के बाद से यह उत्तर अमान्य है।

अनुकूलित दृश्य:

public class CustomView extends View { 
    @Inject 
    AnyObject anyObject; 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     MainActivity mainActivity = (MainActivity) getContext(); 
     mainActivity.getComponent().inject(CustomView.this); 
    } 
} 

गतिविधि:

ActivityComponent mComponent; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mComponent = DaggerActivityComponent.builder() 
        .appComponent(getApp().getAppComponent()) 
        .activityModule(new ActivityModule(MainActivity.this)) 
        .build(); 
    mComponent.inject(MainActivity.this); 
    ... 
} 

public ActivityComponent getComponent() { 
    return mComponent; 
} 
गतिविधि गुंजाइश के साथ

Dagger2 घटक:

@ActivityScope 
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class}) 
public interface ActivityComponent extends AppComponent { 

    void inject(MainActivity mainActivity); 
    void inject(CustomView customView); 
} 

स्कोप:

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ActivityScope {} 
+0

सुराग के लिए धन्यवाद। निष्क्रियता मॉड्यूल (नया गतिविधि मॉड्यूल (मुख्य गतिविधि) यह यह अब दिखाया गया है –

+1

@ तुषार पांडे हां, इसे डैगर 2 के 2.10 संस्करण के बाद से हटा दिया गया है। मुझे जल्द ही अपना जवाब अपडेट करने की आवश्यकता है। – Mussa

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