2017-02-16 6 views
0

なく提供することができない、今私はdagger2を学び、私はエラーを持っている理由を私は理解して傾ける開始:ダガー2は、コンストラクタ私の英語のため申し訳ありません

Error:(9, 10) error: test.dagger.dagger.modules.MainActivityPresenterModule cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. test.dagger.dagger.modules.MainActivityPresenterModule is injected at test.dagger.view.activitys.MainActivity.mainActivityPresenterModule test.dagger.view.activitys.MainActivity is injected at test.dagger.dagger.components.AppComponent.injectMainActivity(mainActivity)

のApp

public class App extends Application { 

    private static AppComponent component; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     component = DaggerAppComponent.create(); 
    } 

    public static AppComponent getComponent() { 
     return component; 
    } 

} 

AppComponent

@Component(modules = {MainActivityPresenterModule.class}) 
public interface AppComponent { 
    void injectMainActivity(MainActivity mainActivity); 
} 

MainActivityPresenterModule

@Module 
public class MainActivityPresenterModule { 

    @Provides 
    MainActivityPresenter provideActivityPresenter(NetworkUtils networkUtils) { 
     return new MainActivityPresenter(networkUtils); 
    } 

    @Provides 
    NetworkUtils provideNetworkUtils(){ 
     return new NetworkUtils(); 
    } 


} 

NetworkUtils

public class NetworkUtils { 

    public boolean isConnection() { 
     return true; 
    } 

} 

MainActivityPresenter

public class MainActivityPresenter { 

    NetworkUtils networkUtils; 

    public MainActivityPresenter(NetworkUtils networkUtils) { 
     this.networkUtils = networkUtils; 
    } 

    public void getUser(){ 
     if(networkUtils.isConnection()) { 
      Log.e("getUser", "getUser"); 
     } else { 
      Log.e("no internet", "no internet connection"); 
     } 
    } 

} 

MainActivity

public class MainActivity extends AppCompatActivity { 


    @Inject 
    MainActivityPresenterModule mainActivityPresenterModule; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     App.getComponent().injectMainActivity(MainActivity.this); 


    } 
} 

答えて

2

あなたは@Module@Providesでアノテートされているモジュール内のメソッドのみ)と注釈付きクラスで提供されている唯一のものを注入することができます。例えば、@Inject MainActivityPresenter presenterを実行することができます。たとえば、しようとしたように、モジュール全体を注入しようとしません。モジュールはあなただけそうのように、モジュールで定義されたあなたの@Inject MainActivityPresenter presenterまたはその他の注入を注入できるように注入呼び出す必要がMainActivityで

component = DaggerAppComponent.builder() 
    .mainActivityPresenterModule(MainActivityPresenterModule()) 
    .build() 

(アプリケーション#のonCreateで)このように、ダガーの初期化に登録する必要があります。

@Inject MainActivityPresenter presenter  

override fun onCreate(savedInstanceState: Bundle) { 
    super.onCreate(savedInstanceState) 
    (application as App).component.inject(this) 

    // after #inject(this) above you can start using your injections: 

    presenter.getUser() 
} 

そのように書くこともはるかに少なかったとして申し訳ありませんが、私はうまくいけば、あなたはそれがJavaでどのように見えるかのアイデアを取得し、Kotlinにコードスニペットを書きました。

関連する問題