F1
ve F2
sınıflarına ait nesnelerim korunan bir Parçacıkta enjekte etmek istiyorum. Ayrıca, Etkinliğe bağlı olarak A
sınıfının bir nesnesine de sahibim ve bu Etkinlikte ve o Etkinliğin Fragman Yöneticisine eklenmiş bir Alıkonan Bölümde enjekte edilmesini istiyorum. Aşağıdaki kodu yazarım. İlk olarak, faaliyet bağımlılığı için modül: OHançer 2: Aktivitede aynı bağımlılığı enjekte edin ve Fragman
@Module
public class MainActivityModule {
private Activity mActivity;
public MainActivityModule(Activity activity) {
mActivity = activity;
}
@Provides
@ActivityScope
public A provideA() {
return new A(mActivity);
}
}
, ilgili bileşenin, bu bağımlı bileşenlere uygun A
nesne yapmak gerekir:
@ActivityScope
@Component(modules = {MainActivityModule.class})
public interface MainActivityComponent {
void inject(MainActivity activity);
// make the A object available to dependent components
A getA();
}
Ayrıca Fragman ile ilgili modül yazmak:
@Module
public class FragmentModule {
@Provides
@FragmentScope
public F1 provideF1() {
return new F1();
}
@Provides
@FragmentScope
public F2 provideF2() {
return new F2();
}
}
ve karşılık gelen bileşen:
@FragmentScope
@Component(modules = {FragmentModule.class}, dependencies = {MainActivityComponent.class})
public interface FragmentComponent {
void inject(MyFragment presenter);
}
Son olarak, özel yaşam döngüsü yöntemlerini de çağırmam gereken Etkinlikte A
bağımlılığını enjekte ediyorum. Etkinlik ayrıca Fragment kendi bileşenini oluştururken kullanmak mümkün olacak şekilde bileşeni almak için bir yöntem sağlar:
// in MainActivity.onCreate
mActivityComponent = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.build();
mActivityComponent.inject(this);
mA.onCreate();
ve ben de Fragment, A
üzerine F1
, F2
bağımlılıkları enjekte etmek deneyin : Etkinlik tahrip olabilmekte ve bir yapılandırma değişikliği (örneğin, bir cihaz rotasyon) tepki sistemi tarafından yeniden edildiğinde Fragman, korunur Ancak
// in MyFragment.onCreate
FragmentComponent component = DaggerFragmentComponent.builder()
.fragmentModule(new FragmentModule())
.mainActivityComponent(((MainActivity) getActivity()).getComponent())
.build();
component.inject(this);
, Fragman ise, eski A
örneği başvurusu tutar Yeni Etkinlik yeni biryeniden oluşturuldu Onunla gitmek içinörneği. Bu soruna geçici bir çözüm bulmak için
FragmentComponent
oluşturmak ve
MyFragment.onActivityCreated
MyFragment.onCreate
yerine enjekte bağımlıları gerekir. Diğer taraftan, bu, etkinlik her defasında ve yeniden oluşturulduğunda
F1
ve
F2
bağımlılıklarının yeniden yaratıldığını gösterir; Ancak bunlar, Fragment kapsamındaki bağımlılıklardır, bu yüzden Etkinliklerin yerine Fragment yaşam döngüsünü izlemelidirler. Bu nedenle benim sorum şu şekildedir: tutulan bir Fragmana enjekte edilen farklı kapsamlarda bağımlılıkların olması mümkün mü? İdeal olarak,
F1
ve
F2
bağımlılıkları
MyFragment.onCreate
'a enjekte edilmeli,
A
bağımlılığı ise
MyFragment.onActivityCreated
'a enjekte edilmelidir. İki farklı bileşen kullanmayı denedim, ancak kısmi enjeksiyon yapmak mümkün görünmüyor. Şu anda,
MyFragment.onActivityCreated
Fragmanı
A
bağımlılığı açık bir yeniden atama ekleyerek sona erdi, ama gerçekten enjeksiyon değil, biliyorsunuz. Bu daha iyi bir şekilde yapılabilir mi?
Enjeksiyon dışında yaşam döngüleri vardır nesnelerle de çalmıyor senin kontrol (Etkinlikler gibi). Genellikle bir parça sadece ebeveyn aktivitesiyle çalışabilir, böylece enjeksiyondan gerçekten faydalanamazsınız. Ancak birim testleri için 'setA (A a)' yöntemini sağlayabilirsiniz, böylece değeri mock/test nesnesi ile geçersiz kılabilirsiniz. Ayrıca: Neden 2 ayrı bileşen kullanıyorsunuz ve grafikleri sırasıyla enjekte ediyorsunuz (bir uygulama geniş bileşeni yerine ve böylece uygulamanın başlamasında grafiğin yalnızca bir yapısına sahip oluyorsunuz)? – Ognyan
@Ogre_BGR Zor olduğunu biliyorum, bu yüzden burada yardım istiyorum. Gördüğüm fayda, Faaliyete giren kod miktarının kırpılmasıyla ilgilidir; 'A' nesnesinde yaşam döngüsü ile ilgili çağrıları içermesi gerekir, ancak nesne gerçekten Fragment tarafından kullanıldığı için, bu kodun Etkinlik içinde değil, Fragmentte kalması gerekir. Yani kod organizasyonuyla ilgili bir şey değil, testler. Uygulama çapında bir bileşen kullanamıyorum çünkü “A” (üzerinde tam denetimim yok) bir Etkinlik örneğine (yalnızca bir Bağlam değil) sıkı bir bağımlılığa sahiptir. –
u bir uygulama modülü yapabilir ve –