Как реализовать Dagger для рабочих классов в Dagger 2.16?
public class SyncWorker extends Worker {
@Inject
ISettingRepository settingRepository;
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
мой компонент приложения
@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();
}
}
Как я могу ввести settingsRepository?




Чтобы внедрить какие-либо классы в 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();
}
}
Теперь напишите в своем коде конструктор, который используется для внедрения компонента в ваш рабочий класс.
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 будет инициализирован.
В моем случае подрядчик не работал в моем Worker, я поставил инжектор в doWork и все нормально
С таким подходом я смог ввести воркера.
Сначала создайте новый метод внутри компонента вашего приложения, который будет внедрять ваш рабочий класс.
@Singleton
public interface AppComponent extends AndroidInjector<YourApplicationClass> {
@Component.Builder
interface Builder {
@BindsInstance
AppComponent.Builder application(Application application);
AppComponent build();
}
void inject(NotifWorker worker);
}
Внутри вашего приложения создайте компонент кинжала как обычно, но назначьте его переменной и сделайте глобальным.
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;
}
}
Внутри своего рабочего класса сделайте что-нибудь вроде этого.
public class NotifWorker extends Worker {
@Inject
ToBeInjectedClass toBeInjectedClass;
public NotifWorker() {
YourApplicationClass
.getInstance()
.getAppComponent()
.inject(this)
}
}
Не делайте этого, по крайней мере используйте getApplicationContext ()
Я изменил текст вопроса.