Comment injecter des dépendances dans n'importe quel type d'objet avec Dagger2?

Selon http://konmik.github.io/snorkeling-with-dagger-2.html, je pourrais simplement ajouter

inject(Anything anything) 

Dans AppComponent.java, mais cela ne fonctionne pas pour moi, dans l'exemple des articles:

  • Comment verrouiller par programme l'écran dans Android?
  • Quel est le problème avec cette chaîne de format?
  • Java.lang.RuntimeException: IOException partagable rencontré l'objet sérialisable d'écriture dans Android passant l'objet ArrayList
  • La fermeture et la réouverture des instances de Realm sont-elles mauvaises pour la performance?
  • Comment puis-je intercepter le flux audio sur un périphérique Android?
  • Le service a échoué IntentReceiver dans Android
  •  @Singleton @Component(modules = AppModule.class) public interface AppComponent { void inject(MainActivity activity); void inject(MainFragment fragment); void inject(MainToolbarView view); } 

    Si j'essaye d'injecter des dépendances dans mon fragment, les membres injectés restent nuls. Quelle erreur évidente est-ce que je manque ici?

    Sources pertinentes:

    ApplicationComponent.java

     @Singleton @Component( modules = ApplicationModule.class ) public interface ApplicationComponent { void injectApplication(BaseApplication application); Prefs providePrefs(); } 

    ApplicationModule.java

     @Module public class ApplicationModule { private final Application application; public ApplicationModule(Application application) { this.application = application; } @Provides Application application() { return application; } @Singleton @Provides Prefs providePrefs() { return Prefs.with(application); } } 

    ActivityComponent.java

     @AScope @Component( dependencies = { ApplicationComponent.class }, modules = ActivityModule.class ) public interface ActivityComponent extends ApplicationComponent { void injectActivity(BaseActivity activity); void injectFragment(BaseFragment fragment); } 

    ActivityModule.java

     @Module public class ActivityModule { private final Activity activity; public ActivityModule(Activity activity) { this.activity = activity; } @Provides Activity activity() { return activity; } @Provides Context context() { return activity; } } 

    BaseApplication.java

     public class BaseApplication extends Application { private ApplicationComponent component; @Override public void onCreate() { super.onCreate(); component = createComponent(); component.injectApplication(this); } private ApplicationComponent createComponent() { return Dagger_ApplicationComponent.builder() .applicationModule(new ApplicationModule(this)) .build(); } public ApplicationComponent getComponent() { return component; } } 

    BaseActivity.java

     public class BaseActivity extends ActionBarActivity implements HasComponent<ActivityComponent> { ActivityComponent component; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); component = Dagger_ActivityComponent.builder() .applicationComponent(((BaseApplication) getApplication()).getComponent()) .activityModule(new ActivityModule(this)) .build(); component.injectActivity(this); } @Override public ActivityComponent getComponent() { return component; } } 

    BaseFragment.java

     public class BaseFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((BaseActivity)getActivity()).getComponent().injectFragment(this); } } 

    ListFragment.java

     public class ListFragment extends BaseFragment { @Inject ListFragmentPresenterImpl listFragmentPresenter; public static ListFragment newInstance(){ ListFragment result = new ListFragment(); return result; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View rootView = inflater.inflate(R.layout.list_fragment, container, false); Log.d("",listFragmentPresenter.sayHello()); // NPE HERE return rootView; } } 

    ListFragmentPresenterImpl.java

     public class ListFragmentPresenterImpl implements ListFragmentPresenter { @Inject public ListFragmentPresenterImpl() { } @Override public String sayHello() { return "hello"; } } 

    Dans Dagger_ActivityComponent, le code généré ressemble à ceci:

     @Override public void injectActivity(BaseActivity activity) { baseActivityMembersInjector.injectMembers(activity); } @Override public void injectFragment(BaseFragment fragment) { MembersInjectors.noOp().injectMembers(fragment); } 

    Ne devrait-il pas y avoir de baseFragmentMemebersInjector?

    Merci!

    One Solution collect form web for “Comment injecter des dépendances dans n'importe quel type d'objet avec Dagger2?”

    Injecter des fragments d'enfant au lieu de BaseFragment . Dans ton cas:

     public class ListFragment extends BaseFragment { @Inject ListFragmentPresenterImpl listFragmentPresenter; public static ListFragment newInstance(){ ListFragment result = new ListFragment(); return result; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((MainActivity)getActivity()).getComponent().injectFragment(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View rootView = inflater.inflate(R.layout.list_fragment, container, false); Log.d("",listFragmentPresenter.sayHello()); // NPE HERE return rootView; } } 

    Et dans votre classe Component:

     @AScope @Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class) interface ActivityComponent { void injectActivity(MainActivity activity); void injectFragment(ListFragment fragment); // Put any more injects here, if BaseFragment has // any other children that need to be injected, for example: void inject(MapFragment fragment); void inject(DetailFragment fragment); } 

    Parent -> L'injection d'enfant ne fonctionne pas dans Dagger 2. Il a été couvert ici , ici et cette question SO .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.