最为一个新手,关于Dagger2,在网上找了一天都是对新手不友好的博客,啥的不懂就直接把很多东西用上了。只能慢慢来了。
First:关于添加Dagger2的依赖
//增加部分
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
dependencies {
..
..
..
compile 'com.android.support:appcompat-v7:23.1.1'
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
compile 'org.glassfish:javax.annotation:10.0-b28'
}
Dagger2最简单的依赖注入一个类:
//想要注入的类
public class ToastUtils {
public Context context;
public ToastUtils(Context context){
this.context=context;
}
public void showToast(String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
}
此时在Activity中:
public class MainActivity extends AppCompatActivity {
@Inject
public ToastUtils toastUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toastUtils.showToast("Activity");
}
}
运行一下会发现报空指针。因为再次虽然申明要注入ToastUtils,但是没有真正注入进来,因为“药物”(ToastUtils)有了,“病人”(Activity)有了,还少了中间的“针”和”筒”,这个“筒”就是“Module”,用来存放ToastUtils,“针”是“Component”,用来将其注入到目标。
//筒
@Module
public class AppModule {
public Context context;
public AppModule(Context context){
this.context=context;
}
@Provides
ToastUtils provideToastUtils(){
return new ToastUtils(context);
}
}
//针
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
万事俱备,现在就可以往activivty中真正注入“ToastUtils”了
public class MainActivity extends AppCompatActivity {
@Inject
public ToastUtils toastUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerAppComponent.builder().appModule(new AppModule(this)).build().inject(this);
toastUtils.showToast("Activity");
setContentView(R.layout.activity_main);
}
}
PS:这里的AppComponent会自动在app/build/generated/source/apt下生成DaggerAppComponent
下面贴上此AppComponent生成的DaggerAppComponent代码
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerAppComponent implements AppComponent {
private Provider<ToastUtils> provideToastUtilsProvider;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DaggerAppComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
private void initialize(final Builder builder) {
this.provideToastUtilsProvider = AppModule_ProvideToastUtilsFactory.create(builder.appModule);
this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideToastUtilsProvider);
}
@Override
public void inject(MainActivity activity) {
mainActivityMembersInjector.injectMembers(activity);
}
public static final class Builder {
private AppModule appModule;
private Builder() {
}
public AppComponent build() {
if (appModule == null) {
throw new IllegalStateException("appModule must be set");
}
return new DaggerAppComponent(this);
}
public Builder appModule(AppModule appModule) {
if (appModule == null) {
throw new NullPointerException("appModule");
}
this.appModule = appModule;
return this;
}
}
}