没有发现碎片匕首2.11的注射器

tsi*_*iro 16 android

我有一个片段的活动.我正在尝试注入片段,但我得到'没有找到com.tsiro.dogvip.login.signin.SignInFrgmt'的例子.

ActivityModule:

@Module(includes = BaseActivityModule.class)
public abstract class LoginActivityModule {

   @PerFragment
   @ContributesAndroidInjector(modules = SignInFragmentModule.class)
   abstract SignInFrgmt signInFrgmtInjector();

   @Binds
   @PerActivity
   abstract Activity activity(LoginActivity loginActivity);
}
Run Code Online (Sandbox Code Playgroud)

FragmentModule:

@Module(includes = BaseFragmentModule.class)
public abstract class SignInFragmentModule {

@Binds
@Named(BaseFragmentModule.FRAGMENT)
@PerFragment
abstract Fragment fragment(SignInFrgmt signInFrgmt);

}
Run Code Online (Sandbox Code Playgroud)

Fragment类扩展了BaseFragment,其中实现了HasSupportFragmentInjector.

BaseFragment:

public abstract class BaseFragment extends Fragment implements HasSupportFragmentInjector, Lifecycle.View {

@Inject
DispatchingAndroidInjector<Fragment> fragmentInjector;
public abstract Lifecycle.ViewModel getViewModel();

@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        // Perform injection here before M, L (API 22) and below because onAttach(Context)
        // is not yet available at L.
        AndroidSupportInjection.inject(this);
    }
    super.onAttach(activity);
}

@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);
    }
    super.onAttach(context);
}

@Override
public void onStart() {
    super.onStart();
    getViewModel().onViewAttached(this);
}

@Override
public void onResume() {
    super.onResume();
    getViewModel().onViewResumed();
}

@Override
public void onPause() {
    super.onPause();
}

@Override
public void onStop() {
    super.onStop();
    getViewModel().onViewDetached();
}

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

 }
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我错过了什么?

Dim*_*CBR 28

您的代码的问题是接口的不正确实现HasSupportFragmentInjectorHasFragmentInjector(这取决于您是否使用支持库的片段).

您应该在托管片段的Activity或Application类中实现此接口.就个人而言,我推荐以下Application类,因此您不必在托管Fragment的每个Activity上实现它:

public class MyApplication extends Application implements HasActivityInjector, HasSupportFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Activity> mActivityInjector;

    @Inject
    DispatchingAndroidInjector<Fragment> mFragmentInjector;

    @Override
    public void onCreate() {
        super.onCreate();

        //The way you build your top-level Application component can vary. This is just an example
        DaggerApplicationComponent.builder()
            .application(this)
            .build()
            .inject(this);

    }

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

    @Override
    public AndroidInjector<Fragment> supportFragmentInjector() {
        return mFragmentInjector;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你注入你的碎片(就像你在代码中已经做过的那样):

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
Run Code Online (Sandbox Code Playgroud)

如果上述操作无效,请确保为要注入的屏幕创建了相应的组件/子组件.如果您使用的是@ContributesAndroidInjector代替手动定义组件,请确保在绑定模块中有一个屏幕条目:

@ContributesAndroidInjector(modules = MyScreenModule.class) abstract MyScreenActivity bindMyScreen();

如果你仍然无法让它工作.我建议阅读实际的Dagger文档:

希望能帮助到你.

  • 对我不起作用,我的错误信息略有不同:`java.lang.IllegalArgumentException:没有为Class <... MyFragment>`绑定注入器工厂.:(我的`Application`子类中已经有`supportFragmentInjector()` (3认同)

Pha*_*inh 7

就我而言,我Fragment已经扩展了DaggerFragment
但是,我的Activity延伸AppCompatActivity我得到了错误 No injector was found for fragment dagger

这很奇怪,因为提到了错误,Fragment并且没有使用片段,所以Activity仍然可以正常工作

变化Activity扩展DaggerAppCompatActivity使其起作用

  • 这挽救了我的一天! (2认同)