TextView
'u genişleten özel bir görünümüm var. Görünümü enjekte etmek için bileşenimi nerede arayayım?Hantal ile bağımlılık enjeksiyonunu görüntüleme 2
component.inject(customTextView);
TextView
'u genişleten özel bir görünümüm var. Görünümü enjekte etmek için bileşenimi nerede arayayım?Hantal ile bağımlılık enjeksiyonunu görüntüleme 2
component.inject(customTextView);
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);
}
}
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);
}
}
, 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 –
Doğru, ancak Android'in bir şey yapması durumunda, tüm kuruculardan arandığından emin olmak isterim. garip :) – EpicPandaForce
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
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 {}
.activityModule (yeni ActivityModule (MainActivity.this)) şimdi depricated –
@TusharPandey Evet, Dagger2'nin 2.10 sürümünden beri kullanılmıyor. Cevabımı yakında güncellemem gerekiyor. – Mussa
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
'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
@GuilhE ... kullan şunu, bu dagger döndürür Bileşen daggerAppComponent = DaggerAppComponent.builder(). Application (this) .build(); –