2017-10-19 69 views
4

我有一個片段的活動。我正在嘗試注入片段,但我得到'沒有發現com.tsiro.dogvip.login.signin.SignInFrgmt'異常的注入器。沒有注射器被發現碎片匕首2.11

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); 

} 

片段類擴展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; 
} 

} 

誰能告訴我,我缺少的是什麼?

+0

你的片段何時注入上面的代碼? – Eselfar

回答

4

您的代碼存在的問題是接口HasSupportFragmentInjectorHasFragmentInjector的錯誤實現(這取決於您是否使用支持庫作爲片段)。

您應該在託管該片段的活動或Application類中實現此接口。就個人而言,我建議以下應用類,所以你不要打擾實現它在承載片段每個活動時間:

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

希望它有幫助。

+2

不適用於我,我的錯誤消息稍有不同:'java.lang.IllegalArgumentException:沒有注入器工廠綁定類<... MyFragment>'。 :(我已經在'Application'子類中有'supportFragmentInjector()' –