There is my worker: (DBmodel is injected class from appComponent)
public class UIUpdaterWorker extends Worker { private DBModel dbModel; String TAG = "FIRST_LAUNCH"; @Inject public UIUpdaterWorker(@Assisted @NonNull Context context,@Assisted @NonNull WorkerParameters workerParams, DBModel dbModel) { super(context, workerParams); this.dbModel = dbModel; } @NonNull @Override public Result doWork() { Log.d(TAG, "Hello world!"); Log.d(TAG, "Injected foo: " + dbModel); return Result.success(); } @AssistedInject.Factory interface Factory extends ChildWorkerFactory{} }
Part in application class:
private void configureWorkManager() { DaggerWorkerFactory workerFactory = new DaggerWorkerComponent.builder().factory(); WorkManager.initialize(this, new Configuration.Builder().setWorkerFactory(workerFactory).build()); }
Part of gradle: (version_work is 1.0.1)
compileOnly "com.squareup.inject:assisted-inject-annotations-dagger2:0.3.2" annotationProcessor 'com.squareup.inject:assisted-inject-processor-dagger2:0.4.0' implementation "android.arch.work:work-runtime:$versions_work" implementation "android.arch.work:work-rxjava2:$versions_work"
Can you express this in a failing test case or minimal executable sample? It's not clear what failure you're seeing or how we would diagnose the underlying cause or write a test to prevent it in the future.
Build project is a success but AssitedInject class doesn't create and I can't start a project. Please help!
I have separate classes:
module:
@Module(includes = {AssistedInject_AssistedInjectModule.class}) @AssistedModule public interface AssistedInjectModule { }
Component:
@Component(modules = {AssistedInjectModule.class, WorkerBindingModule.class}) public interface WorkerComponent { WorkerFactory factory(); }
Child interface:
public interface ChildWorkerFactory { ListenableWorker create(Context context, WorkerParameters workerParameters); }
Worker binding module:
@Module public interface WorkerBindingModule { @Binds @IntoMap @WorkerKey(UIUpdaterWorker.class) ChildWorkerFactory bindUIUpdaterWorker(UIUpdaterWorker.Factory factory); }
Worker key:
@MapKey @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface WorkerKey { Class<? extends ListenableWorker> value(); }
Worker factory:
public class DaggerWorkerFactory extends WorkerFactory { private Map<Class<? extends ListenableWorker>, Provider<ChildWorkerFactory>> workersFactories; @Inject public DaggerWorkerFactory(Map<Class<? extends ListenableWorker>, Provider<ChildWorkerFactory>> workersFactories) { this.workersFactories = workersFactories; } @Nullable @Override public ListenableWorker createWorker(@NonNull Context appContext, @NonNull String workerClassName, @NonNull WorkerParameters workerParameters) { Provider<ChildWorkerFactory> factoryProvider = CollectionsUtil.getWorkerFactoryProviderByKey(workersFactories, workerClassName); return factoryProvider.get().create(appContext, workerParameters); } }
There is my worker: (DBmodel is injected class from appComponent)
public class UIUpdaterWorker extends Worker { private DBModel dbModel; String TAG = "FIRST_LAUNCH"; @Inject public UIUpdaterWorker(@Assisted @NonNull Context context,@Assisted @NonNull WorkerParameters workerParams, DBModel dbModel) { super(context, workerParams); this.dbModel = dbModel; } @NonNull @Override public Result doWork() { Log.d(TAG, "Hello world!"); Log.d(TAG, "Injected foo: " + dbModel); return Result.success(); } @AssistedInject.Factory interface Factory extends ChildWorkerFactory{} }
Part in application class:
private void configureWorkManager() { DaggerWorkerFactory workerFactory = new DaggerWorkerComponent.builder().factory(); WorkManager.initialize(this, new Configuration.Builder().setWorkerFactory(workerFactory).build()); }
Part of gradle: (version_work is 1.0.1)
compileOnly "com.squareup.inject:assisted-inject-annotations-dagger2:0.3.2" annotationProcessor 'com.squareup.inject:assisted-inject-processor-dagger2:0.4.0' implementation "android.arch.work:work-runtime:$versions_work" implementation "android.arch.work:work-rxjava2:$versions_work"