2016-03-23 31 views

cevap

5

Yani, ben (hepsinde veya bir çağrıyı başka olun) benim özel bakış kurucusundaki enjeksiyonu eklemek gerektiğini öğrenmek ettik

Örnek:

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

Hançer 2.11 kullanıyor musunuz? Bunu kimin alabileceğimi gösterir misiniz: Application.getComponent (context)? Uygulamamın AndroidInjector'dan başka bir şey döndürmemesi sağlanabilir. Teşekkürler. – GuilhE

+0

'applicationInjector()' tarafından döndürülen 'ApplicationComponent'' - 'AndroidInjector 'genişletmelidir, bu yüzden' ApplicationComponent' için kullanılabilir. Bunu açıklığa kavuşturmak için 'ApplicationComponent.Builder.build()' türünün dönüş türünü geçersiz kılmam gerektiğini söyleyen bir derleyici uyarısı aldım. AppInnector() işlevini çağırmak pek iyi değildir, bu yüzden birçok kez bileşeni oluşturacağından, bir referansı saklıyorum ... bunun iyi bir uygulama olup olmadığından emin değilim. Belki yeni bir soruda takip edin. – NeilS

+0

@GuilhE ... kullan şunu, bu dagger döndürür Bileşen daggerAppComponent = DaggerAppComponent.builder(). Application (this) .build(); –

3

bu tür şeyler için benim genel çözüm bu

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

, bir kurucunun başka birini çağırmasını sağlamak için bu() öğesini kullanabilirsiniz, bu nedenle tüm kur yapanlar için init eklemeniz gerekmez –

+0

Doğru, ancak Android'in bir şey yapması durumunda, tüm kuruculardan arandığından emin olmak isterim. garip :) – EpicPandaForce

+0

Statik yöntemlerden kurtulmak temel bağımlılık enjeksiyon noktalarından biri değil mi? Ama hala burada statik bir yöntem arıyorsun. Aktivitede ve parçalarda nasıl önleneceğimi biliyorum ama ne olacak? – kingston

2

GÜNCELLEME geçerli: Dagger'ın 2.10 versiyonundan bu cevap geçersizdir.

Özel görünüm:

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); 
    } 
} 

Aktivite:

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; 
} 
Aktivite kapsamı ile

Dagger2 bileşeni:

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

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

Kapsam:

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

.activityModule (yeni ActivityModule (MainActivity.this)) şimdi depricated –

+1

@TusharPandey Evet, Dagger2'nin 2.10 sürümünden beri kullanılmıyor. Cevabımı yakında güncellemem gerekiyor. – Mussa