如何在Dagger 2.16中为工人类实现Dagger?('android.arch.work:work-runtime')

时间:2018-07-11 07:24:45

标签: java android dependency-injection dagger-2 android-workmanager

如何在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?

2 个答案:

答案 0 :(得分:4)

我能够用这种方法注入一个工人。

  1. 首先,在您的应用程序组件内创建一个新方法,该方法将注入您的worker类。

    @Singleton
    public interface AppComponent extends AndroidInjector<YourApplicationClass> {
    
        @Component.Builder
        interface Builder {
    
            @BindsInstance
            AppComponent.Builder application(Application application);
    
            AppComponent build();
        }
    
        void inject(NotifWorker worker);
    }      
    
  2. 在您的应用程序内部,像往常一样构建您的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;
      }
    }
    
  3. 在您的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实例将被初始化。