以下是观看视频时,跟着敲打的代码。遇到某些问题以及解决方法。只在添加依赖以及使用单例类在module中写代码时遇到问题。
1 dagger2基本使用
1.1 使用依赖
注意使用的dagger的版本,不同版本dagger使用的sdk版本不同,使用不当项目会编译不过。视频中使用2.4,如果自己创建的项目也使用2.4编译会不通过。
implementation 'com.google.dagger:dagger:2.40.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.40.3'
1.2 使用dagger需要什么东西
1.3 新建object、module、component
object
public class DatabaseObject {
}
public class HttpObject {
}
module
@Module
public class DatabaseModule {
@Provides
public DatabaseObject providerDatabaseObject(){
return new DatabaseObject();
}
}
@Module //视频中单例类会在HttpModule上面添加@SingleTon,但是我添加后编译报错,删除了才没有问题。
public class HttpModule {
@Provides
@UserScope //单例类相当于@SingleTon
public HttpObject providerHttpObject(){
return new HttpObject();
}
}
component
/*
* 这是一个组件,用于,用于将对象注入到其他类中。
* */
@UserScope //单例类相当于@SingleTon
@Component(modules = {HttpModule.class, DatabaseModule.class})
public interface MyComponent {
//参数不能用Object T多态
void injectMainActivity(MainActivity mainActivity); //注入到MainActivity
void injectSecActivity(SecActivity secActivity);
}
全局单例application
//需要到AndroidManifest.xml中注册
public class MyApplication extends Application {
private MyComponent myComponent;
public MyComponent getMyComponent(){
return myComponent;
}
@Override
public void onCreate() {
super.onCreate();
myComponent = DaggerMyComponent
.builder()
.httpModule(new HttpModule())
.databaseModule(new DatabaseModule())
.presenterComponent(DaggerPresenterComponent.create())
.build();
}
}
注入到MainActivity中
public class MainActivity extends AppCompatActivity {
@Inject
HttpObject httpObject; //httpObject = new HttpObject();
//httpObjectProvider.get()
//module.providerHttpObject()
//new HttpObject()
@Inject
HttpObject httpObject2;
@Inject
DatabaseObject databaseObject;
@Inject
Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// DaggerMyComponent
// .builder()
// .httpModule(new HttpModule())
// .databaseModule(new DatabaseModule())
// .build()
// .injectMainActivity(this);
//全局单例
((MyApplication)getApplication()).getMyComponent().injectMainActivity(this);
Log.d("TAG", "onCreate: " + httpObject.hashCode());
Log.d("TAG", "onCreate: " + httpObject2.hashCode());
Log.d("TAG", "onCreate: " + databaseObject.hashCode());
Log.d("TAG", "onCreate: " + presenter.hashCode());
Button btn = findViewById(R.id.btn);
btn.setOnClickListener((view)->{
startActivity(new Intent(this, SecActivity.class));
});
}
}
public class SecActivity extends AppCompatActivity {
@Inject
HttpObject httpObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sec);
// DaggerMyComponent
// .builder()
// .httpModule(new HttpModule())
// .databaseModule(new DatabaseModule())
// .build()
// .injectSecActivity(this);
((MyApplication)getApplication()).getMyComponent().injectSecActivity(this);
Log.d("TAG", "onCreate: " + httpObject.hashCode());
}
}
2 多个component注入到同一个类中
下列例子将MyComponent和PresentComponent类注入到MainActivity中
2.1 新建component
public class Presenter {
}
@Module
public class PresenterModule {
@Provides
@AppScope
public Presenter providerPresenter(){
return new Presenter();
}
}
@AppScope
@Component(modules = {PresenterModule.class})
public interface PresenterComponent {
public Presenter providerPresenter(); //与myComponent类中的注册到某个类中不一样
}
2.2 将component绑到另一个component上
在dependency那里写。
/*
* 这是一个组件,用于,用于将对象注入到其他类中。
* 如果使用singleTon,要记住16-18条dagger
* 如果不用,自定义scope:使用dependency
* dependency和scope的使用要记住。
* 1.不同的Component上,scope不能相同
* 2.没写scope不能依赖有scoped的component
* */
@UserScope //单例类
@Component(modules = {HttpModule.class, DatabaseModule.class}
,dependencies = {PresenterComponent.class})
public interface MyComponent {
//参数不能用Object T多态
void injectMainActivity(MainActivity mainActivity);
void injectSecActivity(SecActivity secActivity);
}
自定义scope
@Scope
@Documented
@Retention(RUNTIME)
public @interface AppScope {}
2.3 activity上使用绑定完成的component
public class MainActivity extends AppCompatActivity {
@Inject
HttpObject httpObject; //httpObject = new HttpObject();
//httpObjectProvider.get()
//module.providerHttpObject()
//new HttpObject()
@Inject
HttpObject httpObject2;
@Inject
DatabaseObject databaseObject;
@Inject
Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//全局单例
((MyApplication)getApplication()).getMyComponent().injectMainActivity(this);
Log.d("TAG", "onCreate: " + httpObject.hashCode());
Log.d("TAG", "onCreate: " + httpObject2.hashCode());
Log.d("TAG", "onCreate: " + databaseObject.hashCode());
Log.d("TAG", "onCreate: " + presenter.hashCode());
Button btn = findViewById(R.id.btn);
btn.setOnClickListener((view)->{
startActivity(new Intent(this, SecActivity.class));
});
}
}