如何在Dagger 2.16中为工人类实现Dagger?
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
我的AppComponent
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
BaseModule.class,
ApiModule.class,
UserDatabaseModule.class,
SaleDatabaseModule.class,
AppModule.class,
ActivityBuilderModule.class
})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
void inject(BaseApp app);
@Override
void inject(DaggerApplication application);
@Component.Builder
interface Builder {
@BindsInstance
Builder getApp(Application application);
AppComponent build();
}
}
如何注入settingRepository?
答案 0 :(得分:4)
我能够用这种方法注入一个工人。
首先,在您的应用程序组件内创建一个新方法,该方法将注入您的worker类。
@Singleton
public interface AppComponent extends AndroidInjector<YourApplicationClass> {
@Component.Builder
interface Builder {
@BindsInstance
AppComponent.Builder application(Application application);
AppComponent build();
}
void inject(NotifWorker worker);
}
在您的应用程序内部,像往常一样构建您的dagger组件,但将其分配给变量并使其全局。
public class YourApplicationClass implements HasActivityInjector {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.application(this)
.build();
appComponent.inject(this);
}
public AppComponent getAppComponent() {
return appComponent;
}
}
在您的worker类中,执行以下操作。
public class NotifWorker extends Worker {
@Inject
ToBeInjectedClass toBeInjectedClass;
public NotifWorker() {
YourApplicationClass
.getInstance()
.getAppComponent()
.inject(this)
}
}
答案 1 :(得分:3)
要在Dagger 2中注入任何类,必须首先使用模块中的@provides
注释提供这些类。
您必须首先创建一个包含提供所需类的模块的组件。
示例:-
@component(modules = {Module1.class})
public interface Component1{
void inject(SyncWorker syncWorker);
}
@Module
public class Module1{
@Provides
public ISettingRepository getSettingRepo(){
return new ISettingRepository();
}
}
现在在您的代码中编写一个构造函数,该构造函数用于将组件注入到您的worker类中。
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
public SyncWorker(){
DaggerComponent1.builder().build().inject(this);
}
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
现在,当构造函数运行时,您的settingRepository实例将被初始化。