7

私は、ViewUtilsクラスでアクティビティを注入しようとしましたが、失敗しました。私はいくつかの異なる投稿に従ってきましたが、私の実装で何が欠けているのか分かりません。ダガー2.10/2.11注入アクティビティが失敗する

これはおそらく以下の記事の繰り返しです。私は本当にそれをお詫びしますが、正直なところ私は何が欠けているのか分かりません。

を次のように私の実装は次のとおりです:

AppComponent

これらは私が見つけた記事です0

ActivityBindingModule

@Module public abstract class ActivityBindingModule { 

    @ContributesAndroidInjector 
    abstract LoginActivity loginActivity(); 
} 

LoginSubcomponent

@Subcomponent(modules = LoginSubcomponent.LoginActivityModule.class) 
public interface LoginSubcomponent extends AndroidInjector<LoginActivity> { 

    @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<LoginActivity> {} 

    @Module abstract class LoginActivityModule { 

     @Binds abstract Activity bindActivity(LoginActivity activity); 

     @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) { 
      return new ViewUtils(activity); 
     } 
    } 
} 

ViewUtils

public class ViewUtils { 

    private final Activity activity; 

    @Inject public ViewUtils(Activity activity) { 
     this.activity = activity; 
    } 
} 

と私は取得していますエラーがある:

Error:(14, 22) error: [dagger.android.AndroidInjector.inject(T)] android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method. 
android.app.Activity is injected at 
com.emblyapp.app.ui.helpers.ViewUtils.<init>(activity) 
com.emblyapp.app.ui.helpers.ViewUtils is injected at 
com.emblyapp.app.ui.authentication.login.LoginActivity.viewUtils 
com.emblyapp.app.ui.authentication.login.LoginActivity is injected at 
dagger.android.AndroidInjector.inject(arg0) 

ここで何が間違っていますか?助けてくれてありがとう!

編集:私はdagger android documentationで指定されているように私のLoginActivityがAndroidInjection

@Override protected void onCreate(Bundle savedInstanceState) { 
     AndroidInjection.inject(this); 
     super.onCreate(savedInstanceState); 
    } 

答えて

9

との注入を持って言及するのを忘れてしまった:

プロヒント:あなたのサブコンポーネントとそのビルダー場合ステップ2で述べた方法やスーパータイプ以外のメソッドやスーパータイプがない場合は、@ContributesAndroidInjectorを使用してそれらを生成することができます君は。手順2と3の代わりに、アクティビティを返す抽象的なモジュールメソッドを追加し、@ContributesAndroidInjectorと注釈を付けて、サブコンポーネントにインストールするモジュールを指定します。サブコンポーネントにスコープが必要な場合は、スコープ注釈もメソッドに適用します。

したがって、我々はLoginSubcomponentを取り除くとActivityBindingModuleに次の変更を行うことができます。

 


    @Module 
    public abstract class ActivityBindingModule { 

     @ActivityScope 
     @ContributesAndroidInjector(modules = LoginActivityModule.class) 
     abstract LoginActivity loginActivity(); 
    } 

 

LoginActivityModuleを。Javaの

 


    @Module 
    abstract class LoginActivityModule { 

     @Binds 
     abstract Activity bindActivity(LoginActivity activity); 

     @Provides 
     @ActivityScope 
     static ViewUtils viewUtils(Activity activity) { 
      return new ViewUtils(activity); 
     } 
    } 

 

カスタムアプリケーションクラス:

 


    public class MyApp extends DaggerApplication { 

     @Inject 
     DispatchingAndroidInjector dispatchingActivityInjector; 

     @Override 
     protected AndroidInjector applicationInjector() { 
      return DaggerAppComponent.builder().create(this); 
     } 

    } 

 
+1

はい!ありがとうございました。私は混乱の原因となったドキュメンテーションの部分をよく理解していませんでした。わかった。 ContributesAndroidInjectorを使用すると、(それによって作成された)サブコンポーネントをスキップできます。私はそれを得る!助けてくれてありがとう、それは今働いている:) – Peddro

関連する問題