This repository was archived by the owner on Aug 20, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 44
This repository was archived by the owner on Aug 20, 2025. It is now read-only.
ContributesAndroidInjector doesn't work for Fragment inside an Activity #174
Copy link
Copy link
Open
Description
If you have a nested ContributesAndroidInjector then it doesn't work properly. Dagger complains about a missing injector factory. Dagger with code generation works fine, only dagger reflect is crashing.
@Module
public interface ExampleActivityModule {
@ContributesAndroidInjector
ExampleFragment fragment();
}Full Example here kokeroulis@adbd4ab
stacktrace
E java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.ExampleActivity}: java.lang.IllegalArgumentException: No injector factory bound for Class<com.example.ExampleFragment>
E at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
E at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
E at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
E at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
E at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
E at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
E at android.os.Handler.dispatchMessage(Handler.java:106)
E at android.os.Looper.loop(Looper.java:193)
E at android.app.ActivityThread.main(ActivityThread.java:6669)
E at java.lang.reflect.Method.git invoke(Native Method)
E at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<com.example.ExampleFragment>
E at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:136)
E at dagger.android.AndroidInjection.inject(AndroidInjection.java:181)
E at dagger.android.AndroidInjection.inject(AndroidInjection.java:91)
E at com.example.ExampleFragment.onAttach(ExampleFragment.java:11)
E at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1242)
E at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2426)
E at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2205)
E at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2161)
E at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2062)
E at android.app.FragmentManagerImpl.dispatchMoveToState(FragmentManager.java:3051)
E at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2998)
E at android.app.FragmentController.dispatchActivityCreated(FragmentController.java:182)
E at android.app.Activity.performCreate(Activity.java:7143)
E at android.app.Activity.performCreate(Activity.java:7127)
E at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
E at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
E ... 11 more
Part of the code which reproduces this issue
@Component(modules = {
AndroidInjectionModule.class,
ActivityBindingModule.class
})
interface AppComponent {
void inject(ExampleApp app);
DispatchingAndroidInjector<Object> androidInjector();
}public final class ExampleActivity extends Activity implements HasAndroidInjector {
@Inject
DispatchingAndroidInjector<Object> androidInjector;
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().add(new ExampleFragment(), "some tag").commit();
}
@Override
public AndroidInjector<Object> androidInjector() {
return androidInjector;
}
}@Module
public interface ExampleActivityModule {
@ContributesAndroidInjector
ExampleFragment fragment();
}public final class ExampleApp extends Application implements HasAndroidInjector {
private AppComponent component;
@Inject
DispatchingAndroidInjector<Object> androidInjector;
@Override
public void onCreate() {
super.onCreate();
component = Dagger.create(AppComponent.class);
component.inject(this);
}
@Override
public AndroidInjector<Object> androidInjector() {
return androidInjector;
}
}public class ExampleFragment extends Fragment {
@Override
public void onAttach(Context context) {
AndroidInjection.inject(this);
super.onAttach(context);
}
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels