简体   繁体   中英

No injector was found for fragment dagger 2.14.1

While trying to inject the fragment, the App is crashing by throwing the error

java.lang.IllegalArgumentException: No injector was found for fragment

The codes that i have implemented is given below respectively.I searched most of the similar questions but was not able to find a solution,

In AppModule i'am adding,

@ContributesAndroidInjector
  abstract PendingFragment pendingFragmentInjector();

The Application class.

public class Application extends Application implements HasActivityInjector,HasFragmentInjector{

  @Inject
  DispatchingAndroidInjector<Activity> androidInjector;
  @Inject
  DispatchingAndroidInjector<Fragment> mFragmentInjector;
  private String androidId;

  @Override
  public void onCreate() {
    super.onCreate();
    if (BuildConfig.DEBUG) {
      Timber.plant(new Timber.DebugTree());
    }
    Stetho.initializeWithDefaults(this);
    DaggerAppComponent.builder().create(this).inject(this);
    //androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

  }

  public String getAndroidId() {
    return androidId;
  }

  @Override
  public AndroidInjector<Activity> activityInjector() {
    return androidInjector;
  }

  @Override
  public AndroidInjector<Fragment> fragmentInjector() {
    return mFragmentInjector;
  }
}

Activity:

public class MyRequestActivity extends AppCompatActivity implements HasActivityInjector,
      HasFragmentInjector {

      @Inject
      DispatchingAndroidInjector<Activity> mDispatchingAndroidInjector;
      @Inject
      DispatchingAndroidInjector<Fragment> mFragmentInjector;
      @Inject
      ViewModelProvider.Factory factory;
    @Override
      protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_request);
        ButterKnife.bind(this);
        myRequestsViewModel = ViewModelProviders.of(this, factory).get(MyRequestsViewModel.class);
        dataPassingviewModel = ViewModelProviders.of(this).get(DataPassingViewModel.class);

      }
    @Override
      public AndroidInjector<Fragment> fragmentInjector() {
        return mFragmentInjector;
      }

      @Override
      public AndroidInjector<Activity> activityInjector() {
        return mDispatchingAndroidInjector;
      }
    }

Fragment:

public class PendingFragment extends Fragment implements HasSupportFragmentInjector {

  @BindView(R.id.rvPending)
  RecyclerView rvPending;
  Unbinder unbinder;
  private Context mContext;

  private DataPassingViewModel dataPassingViewModel;

  @Inject
  DispatchingAndroidInjector<Fragment> mDispatchingAndroidInjector;
  @Inject
  ViewModelProvider.Factory mFactory;

  //public static PendingFragment newInstance() {
  //  return new PendingFragment();
  //}

  PendingRecyclerViewAdapter adapter;

  @Nullable
  @Override
  public View onCreateView(
    @NonNull LayoutInflater inflater,
    @Nullable ViewGroup container,
    @Nullable Bundle savedInstanceState
  ) {
    final View view = inflater.inflate(R.layout.fragment_pending, container, false);
    unbinder = ButterKnife.bind(this, view);
    return view;
  }

  @Override
  public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    if (adapter != null) {
      adapter.saveStates(outState);
    }
  }

  @Override
  public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    if (adapter != null) {
      adapter.restoreStates(savedInstanceState);
    }
  }

  public void update(final List<ServicePending> pendingList) {
    rvPending.setAdapter(new PendingRecyclerViewAdapter(pendingList));
  }

  @Override
  public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }

  @Override
  public AndroidInjector<Fragment> supportFragmentInjector() {
    return mDispatchingAndroidInjector;
  }

  private void observeOn() {
    dataPassingViewModel.getObservable().observe(this, passedObject -> {
      if (passedObject instanceof GetServiceResponse) {

        final GetServiceResponse pendingList = (GetServiceResponse) passedObject;
        if (pendingList.pending != null && pendingList.pending.size() > 0) {
          update(pendingList.pending);
        }
      }
    });
  }

  @Override
  public void onAttach(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
      // Perform injection here for M (API 23) due to deprecation of onAttach(*Activity*).
      AndroidSupportInjection.inject(this);
    }
    this.mContext = context;
    rvPending.setLayoutManager(new LinearLayoutManager(getContext()));
    rvPending.setNestedScrollingEnabled(true);
    if (getActivity() != null) {
      dataPassingViewModel = ViewModelProviders.of(getActivity()).get(DataPassingViewModel.class);
    }
    observeOn();
    super.onAttach(context);
  }

  @SuppressWarnings("deprecation")
  @Override
  public void onAttach(Activity activity) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
      // Perform injection here for versions before M as onAttach(*Context*) did not yet exist
      AndroidSupportInjection.inject(this);
    }
    this.mContext = activity;
    rvPending.setLayoutManager(new LinearLayoutManager(getContext()));
    rvPending.setNestedScrollingEnabled(true);
    if (getActivity() != null) {
      dataPassingViewModel = ViewModelProviders.of(getActivity()).get(DataPassingViewModel.class);
    }
    observeOn();
    super.onAttach(activity);
  }
}

Any help will be appreciated ,

Thank you.

Solved the issue,

Activity class has to implement HasSupportFragmentInjector not HasFragmentInjector .

and

Replace

 @Inject
  DispatchingAndroidInjector<Fragment> mFragmentInjector;

with

 @Inject
  DispatchingAndroidInjector<android.support.v4.app.Fragment> mFragmentDispatchingAndroidInjector;

eg:

public class MyRequestActivity extends AppCompatActivity implements HasActivityInjector,
      HasFragmentInjector {

      @Inject
      DispatchingAndroidInjector<Activity> mDispatchingAndroidInjector;
     @Inject
  DispatchingAndroidInjector<android.support.v4.app.Fragment> mFragmentDispatchingAndroidInjector;
      @Inject
      ViewModelProvider.Factory factory;
    @Override
      protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_request);
        ButterKnife.bind(this);
        myRequestsViewModel = ViewModelProviders.of(this, factory).get(MyRequestsViewModel.class);
        dataPassingviewModel = ViewModelProviders.of(this).get(DataPassingViewModel.class);

      }
      @Override
  public AndroidInjector<android.support.v4.app.Fragment> supportFragmentInjector() {
    return mFragmentDispatchingAndroidInjector;
  }


      @Override
      public AndroidInjector<Activity> activityInjector() {
        return mDispatchingAndroidInjector;
      }
    }

Hope it may help someone in future.

Make you activity extend DaggerAppCompatActivity . This will give you all that you need out of the box.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM