Dagger學習之實踐篇

基於已有的項目結構引入Dagger,不能徹底按照項目android-architecture的架構去寫,只能是增長引入Dagger。java

環境搭建android

1,gradle中增長插件android-aptgit

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//看這裏,看這裏,看這裏
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2,gradle中應用插件github

apply plugin: 'com.neenbedankt.android-apt'//這裏應用插件

dependencies {
    //dagger
    apt 'com.google.dagger:dagger-compiler:2.11'
    provided 'org.glassfish:javax.annotation:10.0-b28'
    compile 'com.google.dagger:dagger:2.11'
    compile 'com.google.dagger:dagger-android:2.11'
    compile 'com.google.dagger:dagger-android-support:2.11'
    apt 'com.google.dagger:dagger-android-processor:2.11'
}

3,增長一個繼承DaggerApplication的類App架構

public class App extends DaggerApplication {
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().build();
    }
}

4,建立AppComponentapp

@Singleton
@Component(modules = {ActivityBindModule.class, AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<App> {

}

5,建立AndroidBindModule,配置須要使用Dagger的Activity(繼承DaggerAppCompatActivity)ide

@Module
public abstract class ActivityBindModule {
    @ContributesAndroidInjector(modules = {HomeModule.class, DashboardModule.class, NotificationsModule.class})
    abstract MainActivity mainActivity();
}

6,建立HomeModulegradle

@Module
public abstract class HomeModule {

    @ContributesAndroidInjector
    abstract HomeFragment fragment();

    @Provides
    static HomePresenter homePresenter() {
        return new HomePresenter();
    }
}

遺留問題:ui

1,HomeFragment中presenter的聲明是HomePresenter,不是IContract.IPresentergoogle

2,未引入@ActivityScoped,@FragmentScoped

小結:

  • @Inject標註的屬性不能是private
  • @Provides標註的方法不能是抽象方法
  • @Component標註的接口至少有一個方法,不然編譯不會生成實現類
相關文章
相關標籤/搜索