How to implement Dagger for worker classes in Dagger 2.16 ?('android.arch.work:work-runtime')

怎甘沉沦 提交于 2020-01-14 04:36:41

问题


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.

  1. 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);
    }      
    
  2. 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;
      }
    }
    
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!