2016-04-25 32 views
8

Sadece Dagger 2 kullanmaya başladım ve her biri farklı bir uygulama ile çevrimiçi binlerce rehber buldum ve şimdi biraz kafam karıştı.Hançer enjeksiyonu ile Hançer 2

AppModule.java:

@Module 
public class AppModule { 

Application mApplication; 

public AppModule(Application application) { 
    mApplication = application; 
} 

@Provides 
@Singleton 
Application providesApplication() { 
    return mApplication; 
} 
} 

DataModule.java:

@Module 
public class DataModule { 

private static final String BASE_URL = "http://beta.fridgewizard.com:9001/api/"; 

@Provides 
@Singleton 
NetworkService provideNetworkService() { 
    return new NetworkService(BASE_URL); 
} 

@Provides 
@Singleton 
SharedPreferences provideSharedPreferences(Application app) { 
    return PreferenceManager.getDefaultSharedPreferences(app); 
} 
} 

PrefsModel.java:

@Module(includes = DataModule.class) 
public class PrefsModel { 

@Provides 
@Singleton 
QueryPreferences provideQuery(SharedPreferences prefs) { 
    return new QueryPreferences(prefs); 
} 
} 

AppComponent Yani temelde bu şu anda yazdıklarını .java (Ben bir sunumcuya ihtiyaç duyduğumdan beri QueryPreferences nesnesini açığa çıkarıyorum, umarım) Bu şekilde doğrudur:

@Singleton 
@Component(modules = {AppModule.class, DataModule.class, PrefsModel.class}) 
public interface AppComponent { 

    void inject(HomeFragment homeFragment); 

    QueryPreferences preferences(); 
    NetworkService networkService(); 
} 

Sonra FwApplication.java vardır:

@Module 
public class PresenterModule { 

    @Provides 
    Presenter<FwView> provideHomePresenter(NetworkService networkService) { 
     return new HomePresenterImpl(networkService); 
    } 

    @Provides 
    Presenter<FwView> provideSearchPresenter(NetworkService networkService) { 
     return new SearchPresenterImpl(networkService); 
    } 

} 

ve aşağıdaki bileşen (: Son olarak sunum için başka bir modül ilave

public class FwApplication extends Application { 

private static final String TAG = "FwApplication"; 

private NetworkService mNetworkService; 

private AppComponent mDataComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     buildComponentAndInject(); 
    } 

    public static AppComponent component(Context context) { 
     return ((FwApplication) context.getApplicationContext()).mDataComponent; 
    } 

    public void buildComponentAndInject() { 
     mDataComponent = DaggerComponentInitializer.init(this); 
    } 

    public static final class DaggerComponentInitializer { 
     public static AppComponent init(FwApplication app) { 
     return DaggerAppComponent.builder() 
       .appModule(new AppModule(app)) 
       .dataModule(new DataModule()) 
       .build(); 
    } 
    } 
} 

Burada bir bağımlı bağımlılıklar ekleyemediğim için hata döndürüyor):

@Component(dependencies = AppComponent.class, modules = PresenterModule.class) 
public interface PresenterComponent { 

    void inject(HomePresenterImpl presenter); 
} 
o AppComponent tanımlanan bir tekil olan networkservice bağlı olduğu için

  • nasıl sunum bileşeninde hatayı düzeltebilirsiniz:

    Yani, beni dokümantasyon çevrimiçi okumak için net değildir kaç soru var?

    HomeFragment: Düzeltme -

  • Ben "Yeni HomePresenter (NetworkService)" ile HomePresenter uygulamalıdır ama şimdi DI

DÜZENLEME tanımlanmış nasıl kullanılacağını bilmiyorum bir HomeFragment var .java:

:
public class HomeFragment extends Fragment { 

private static final String TAG = "FW.HomeFragment"; 


@Inject 
HomePresenterImpl mHomePresenter; 

public static HomeFragment newInstance() { 
    return new HomeFragment(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    FwApplication.component(getActivity()).inject(this); 
} 

Sonra bu şekilde sunum yapıcısı modifiye

Daha sonra NetworkService otomatik olarak enjekte edilir.

Aşağıdaki kodu yukarıdaki ile aynı şekilde yapılmış bir sunum ihtiyacı Ben her parça için aramak zorunda çünkü bu şekilde doğru olup olmadığını merak ediyorum: Sen

FwApplication.component(getActivity()).inject(this); 
+0

'Sunucunun içerisindeki hatayı düzeltin 'lütfen * her zaman * –

+1

' '' getAactivity() '' '' '' 'inCreate()' '' '' 'NullPointerException''''nü üretebilir. http://stackoverflow.com/a/6225044/1888738 – Bresiu

cevap

11

karıştırma işi. Sunucunuzu sağlamak için, aşağıdaki gibi bir şeye geçiş yapmanız gerekir:

Mümkünse kurucu enjeksiyonu kullanın.Bu

public class HomePresenterImpl { 

    @Inject 
    public HomePresenterImpl(NetworkService networkService) { 
     // ... 
    } 

} 

arayüz kullanacağım bu yapıcı injecetion sağlamak şeyleri çok daha kolay hale getirecek ve uygulanması

Presenter<FwView> provideHomePresenter(HomePresenterImpl homePresenter) { 
    return homePresenter; 
} 

herhangi yapıcıları kendini aramak zorunda değilsiniz Bu şekilde üzerinde bağlıdır. Ve aslında ... sunum

public class MyFragment extends Fragment { 

    @Inject 
    Presenter<FwView> mHomePresenter; 

    public void onCreate(Bundle xxx) { 
     // simplified. Add your modules/Singleton component 
     PresenterComponent component = DaggerPresenterComponent.create().inject(this); 
    } 
} 

şeyler enjekte Bu şekilde enjekte etmek. Lütfen bunu dikkatle okuyun ve anlamaya çalışın. Bu

// DON'T 
@Provides 
Presenter<FwView> provideHomePresenter(NetworkService networkService) { /**/ } 

@Provides 
Presenter<FwView> provideSearchPresenter(NetworkService networkService) { /**/ } 

Bu olmaz işi (aynı kapsamda) hala aynı modülünden aynı tipte 2 sunum sağlayamaz sizin ana sorunları çözecektir. Aynı türden 2 nesne sağlayamazsınız. Onlar ayırt edilemez. Bunun gitmek istediğiniz yol olduğundan eminseniz @Qualifiers'u @Named'a bir göz atın.

+0

Cevabınız için çok teşekkür ederim, tavsiyenizi takip ederek nasıl düzeltildiğimi göstermek için soruyu düzenledim. (Ev sahibi Presenter enjeksiyonunu nasıl yaptığım konusunda emin değilim) – user1341300

+2

@David, "homePresenter" öğeniz için; '@ Binds 'açıklamasını kullanabilir, bu da sahnelerin arkasında daha iyi bir kod oluşturabilir. Https://google.github.io/dagger/faq.html#binds ve https://google.github.io/dagger/api/latest/dagger/Binds.html – TWiStErRob

+0

adresine bakın. Çok teşekkür ederim! Bununla kendimle de mücadele ediyordum. Bu benim bazı şüphelerimi temizledi. Tekrar teşekkürler. – taitasciore

4

Kurucuda @ Inject ek açıklama kullanıldığında Presenter sağlamanız gerekmez. Sınıfın yapıcısında kullanılan @Inject notu, bu sınıfı bağımlılık grafiğinin bir parçası yapar. Böylece, gerektiğinde de enjekte edilebilir.

Diğer taraftan, @ Not ekleme notlarını alanlara eklerseniz, ancak kurucular için eklemezseniz, bu sınıfı sağlamanız gerekir.