您好,登錄后才能下訂單哦!
在Android開發中使用Dagger2的方法?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
使用方法如下:
@Component(modules = MyAppModule.class) public abstract class MyAppComponent { ...... //使用SubComponent功能來完成component的組合 abstract ActComponent plus(); }
@Subcomponent(modules = ActModule.class) public interface ActComponent { void inject(ActActivity act); }
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); MyAppComponent.getInstance().inject(this); } }
然后就是就在Activity中使用ActComponent來提供注入功能,代碼看上去就像如下...
MyAppComponent.getInstance() .plus() .inject(this);
為神馬我使用的明明是ActComponent
,關MyAppComponent
什么事?(我最開始學習使用dagger2的時候完全無法接受這種寫法),而且這似乎不太符合依賴注入的一個根本原則a class shouldn't know anything about how it is injected.
新用法
谷歌爸爸很明顯也注意到了這個問題,誰叫Dagger2在Android開發中也那么火呢,于是在Dagger2新版本中我們有了一個新東西dagger.android
Gradle引入方式
//dagger2 compile 'com.google.dagger:dagger:2.11' compile 'com.google.dagger:dagger-android:2.11' compile 'com.google.dagger:dagger-android-support:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11' annotationProcessor 'com.google.dagger:dagger-android-processor:2.11'
Demo地址在 https://github.com/hanliuxin5/Dagger2-demo
結合Demo和官方文檔粗略翻譯如下
1、在AppComponent中安裝AndroidInjectionModule
@Component(modules = {AndroidInjectionModule.class}) public interface AppComponent { //.... }
2.編寫實現了AndroidInjector<YourActivity>的Lychee3Activity
@Subcomponent(modules = ...) public interface ActSubComponent extends AndroidInjector<Lychee3Activity> { @Subcomponent.Builder public abstract class Builder extends AndroidInjector.Builder<Lychee3Activity> { } }
3.定義了ActSubComponent后,將其安裝在綁定了ActSubComponent.Builder的Module中,并且將該Module安裝在我們的AppComponent中
@Module(subcomponents = {ActSubComponent.class}) public abstract class BuildersModule { @Binds @IntoMap @ActivityKey(Lychee3Activity.class) abstract AndroidInjector.Factory<? extends Activity> lychee3Activity(ActSubComponent.Builder builder); }
@Component(modules = {AndroidInjectionModule.class, BuildersModule.class}) public interface AppComponent { //.... }
但是如果你的ActSubComponent
若同我們在步驟2中定義的一樣,不管在類中還是在其Builder中沒有的方法和超類型,你可以用下面的代碼跳過2,3步驟
原文 Pro-tip: If your subcomponent and its builder have no other methods or supertypes than the ones mentioned in step #2, you can use @ContributesAndroidInjector to generate them for you
@ContributesAndroidInjector abstract Lychee2Activity lychee2Activity();
4.讓你的MyApplication實現HasActivityInjector,并且注入DispatchingAndroidInjector,
public class MyApplication extends Application implements HasActivityInjector { @Inject DispatchingAndroidInjector<Activity> dispatchingAndroidInjector; @Override public void onCreate() { super.onCreate(); DaggerAppComponent.builder().AppContent(this).build().inject(this);//最好結合demo來看,不然AppContent是啥你不知道 } @Override public AndroidInjector<Activity> activityInjector() { return dispatchingAndroidInjector; } }
5.最后,在你Lychee3Activity和Lychee2Activity中的onCreate中,調super.onCreate()之前調用AndroidInjection.inject(this);
public class Lychee2Activity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); } }
看完上述內容,你們掌握在Android開發中使用Dagger2的方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。