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

Ahm*_*deh 3 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() {

    }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序组件

@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();
    }

}
Run Code Online (Sandbox Code Playgroud)

如何注入settingRepository?

小智 5

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

  1. 首先,在应用程序组件中创建一个新方法来注入您的工作类。

    @Singleton
    public interface AppComponent extends AndroidInjector<YourApplicationClass> {
    
        @Component.Builder
        interface Builder {
    
            @BindsInstance
            AppComponent.Builder application(Application application);
    
            AppComponent build();
        }
    
        void inject(NotifWorker worker);
    }      
    
    Run Code Online (Sandbox Code Playgroud)
  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;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在你的工人阶级中,做这样的事情。

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