问题
How to implement Dagger for worker classes in Dagger 2.16?
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
my 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();
}
}
How can I inject the settingRepository?
回答1:
I was able to inject a worker with this approach.
First, create a new method inside your app component that will inject your worker class.
@Singleton public interface AppComponent extends AndroidInjector<YourApplicationClass> { @Component.Builder interface Builder { @BindsInstance AppComponent.Builder application(Application application); AppComponent build(); } void inject(NotifWorker worker); }
Inside your application, build your dagger component as usual but assign it to a variable and make it global.
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; } }
Inside your worker class, do something like this.
public class NotifWorker extends Worker { @Inject ToBeInjectedClass toBeInjectedClass; public NotifWorker() { YourApplicationClass .getInstance() .getAppComponent() .inject(this) } }
回答2:
To inject any classes in Dagger 2, you have to first provide those classes using @provides
annotation in the module.
You have to first create a component containing a module which provides the desired class.
Example:-
@component(modules = {Module1.class})
public interface Component1{
void inject(SyncWorker syncWorker);
}
@Module
public class Module1{
@Provides
public ISettingRepository getSettingRepo(){
return new ISettingRepository();
}
}
Now write in your code, a constructor that is used to inject the component into your worker class.
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() {
}
}
Now when the constructor runs, your settingRepository instance would be initialized.
来源:https://stackoverflow.com/questions/51279541/how-to-implement-dagger-for-worker-classes-in-dagger-2-16-android-arch-workw