cashapp / InflationInject

Constructor-inject views during XML layout inflation
Apache License 2.0
904 stars 55 forks source link

AssistedInject_ doesn't work java #98

Closed MrWinWon closed 4 years ago

MrWinWon commented 5 years ago

Build project is a success but AssitedInject class doesn't create and I can't start a project. Please help!

I have separate classes:

  1. module: @Module(includes = {AssistedInject_AssistedInjectModule.class}) @AssistedModule public interface AssistedInjectModule { }

  2. Component: @Component(modules = {AssistedInjectModule.class, WorkerBindingModule.class}) public interface WorkerComponent { WorkerFactory factory(); }

  3. Child interface: public interface ChildWorkerFactory { ListenableWorker create(Context context, WorkerParameters workerParameters); }

  4. Worker binding module: @Module public interface WorkerBindingModule { @Binds @IntoMap @WorkerKey(UIUpdaterWorker.class) ChildWorkerFactory bindUIUpdaterWorker(UIUpdaterWorker.Factory factory); }

  5. Worker key: @MapKey @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface WorkerKey { Class<? extends ListenableWorker> value(); }

  6. 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); } }

  7. 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"

JakeWharton commented 5 years ago

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.