Как реализовать Dagger для рабочих классов в Dagger 2.16? ('Android.arch.work:work-runtime')

Как реализовать 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
717
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы внедрить какие-либо классы в 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 будет инициализирован.

Я изменил текст вопроса.

Ahmad Aghazadeh 11.07.2018 10:49

В моем случае подрядчик не работал в моем Worker, я поставил инжектор в doWork и все нормально

Kirk_hehe 06.09.2018 13:45
Ответ принят как подходящий

С таким подходом я смог ввести воркера.

  1. Сначала создайте новый метод внутри компонента вашего приложения, который будет внедрять ваш рабочий класс.

    @Singleton
    public interface AppComponent extends AndroidInjector<YourApplicationClass> {
    
        @Component.Builder
        interface Builder {
    
            @BindsInstance
            AppComponent.Builder application(Application application);
    
            AppComponent build();
        }
    
        void inject(NotifWorker worker);
    }      
    
  2. Внутри вашего приложения создайте компонент кинжала как обычно, но назначьте его переменной и сделайте глобальным.

    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;
      }
    }
    
  3. Внутри своего рабочего класса сделайте что-нибудь вроде этого.

    public class NotifWorker extends Worker {
    
      @Inject
      ToBeInjectedClass toBeInjectedClass;
    
      public NotifWorker() {
        YourApplicationClass
            .getInstance()
            .getAppComponent()
            .inject(this)
      }
    }
    

Не делайте этого, по крайней мере используйте getApplicationContext ()

lawonga 15.04.2020 09:23

Другие вопросы по теме