我有一个片段的活动。我正在尝试注入片段,但我得到的是没有找到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);
}
FragmentModule:
@Module(includes = BaseFragmentModule.class)
public abstract class SignInFragmentModule {
@Binds
@Named(BaseFragmentModule.FRAGMENT)
@PerFragment
abstract Fragment fragment(SignInFrgmt signInFrgmt);
}
Fragment类扩展了实现HasSupportFragmentInjector的BaseFragment。
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;
}
}
有人能告诉我我错过了什么吗?
答案 0 :(得分:18)
您的代码存在的问题是接口HasSupportFragmentInjector
或HasFragmentInjector
的错误实现(取决于您是否使用支持库获取片段)。
您应该在托管片段的Activity中或在Application类中实现此接口。就个人而言,我建议使用以下Application类,这样您就不必在托管片段的每个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;
}
}
然后在你注入你的碎片(正如你在代码中所做的那样):
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
}
如果上述操作无效,请确保为要注入的屏幕创建了相应的组件/子组件。如果您使用@ContributesAndroidInjector
而不是手动定义组件,请确保在绑定模块中有一个屏幕条目:
@ContributesAndroidInjector(modules = MyScreenModule.class)
abstract MyScreenActivity bindMyScreen();
如果你仍然无法让它工作。我建议您阅读实际的Dagger documentation:
希望它有所帮助。
答案 1 :(得分:3)
我修复了这个错误。首先,使用DaggerFragment扩展您的片段
class BaseFragment : DaggerFragment(){}
之后,在相同的片段中添加onAttach方法:
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
PS:我正在使用Kotlin。
答案 2 :(得分:3)
就我而言,
我的Fragment
已经扩展了DaggerFragment
。
但是,我的Activity
扩展了AppCompatActivity
,但出现错误
No injector was found for fragment dagger
这很奇怪,因为该错误是关于Fragment
的提及,并且没有使用片段,Activity仍然可以正常工作
更改Activity
扩展 DaggerAppCompatActivity
,使其生效
答案 3 :(得分:1)
当我使用匕首版本2.26
时,发生了此问题,然后我将匕首版本更改为2.23.2
,直到它起作用。尝试使用2.23.2 vesion:
implementation "com.google.dagger:dagger-android-support:2.23.2"