1

私はDaggerを使用する既存のプロジェクトで作業しています。Android DaggerエラーでシンボルクラスDaggerDashboardComponentを見つけることができません

これは私の最初のダガー使用の試みであり、これで少し失われています。

私は/コンポーネント既存のフラグメント/モジュールから既存のクラス、インタフェース、および他のすべてのすべてを複製しようとしている、と私は、次のエラーを取得しています

Error:(7, 42) error: cannot find symbol class DaggerDashboardComponent

私は、Clean ProjectRebuild Projectを試してみました私はInvalidate Caches and Restartを試しましたが、私はAndroid Studioのコンパイラ設定からアノテーション機能を有効にしましたが、プロジェクトを閉じて再オープンしようとしましたが、何らかの理由で(おそらくクラス生成の間違いのため)、短剣はコンパイルできません必要なクラスを生成します。

FragmentDashboard:

package com.example.app.ui.dashboard; 

import com.example.app.R; 
import com.example.app.base.AbstractRequestFragment; 
import com.example.app.databinding.FragmentDashboardBinding; 
import com.example.app.di.component.AppComponent; 
import com.example.app.di.component.DaggerDashboardComponent; 
import com.example.app.di.module.DashboardModule; 
import com.example.app.presenter.dashboard.DashboardPresenter; 
import com.example.app.ui.dashboard.DashboardView; 

import javax.inject.Inject; 

import retrofit2.Call; 

/** 
* Created by on 31-05-2017. 
*/ 
public class FragmentDashboard extends AbstractRequestFragment<FragmentDashboardBinding> implements DashboardView { 

    @Inject 
    DashboardPresenter dashboardPresenter; 

    @Override 
    protected int layoutToInflate() { 
     return R.layout.fragment_dashboard; 
    } 

    @Override 
    protected void injectComponent(AppComponent appComponent) { 
     DaggerDashboardComponent.builder() 
       .appComponent(appComponent) 
       .dashboardModule(new DashboardModule(this)) 
       .build() 
       .inject(this); 
    } 

    @Override 
    protected void initializePresenter(FragmentDashboardBinding fragmentDashboardBinding) { 
     dashboardPresenter.initialize(fragmentDashboardBinding); 
    } 

    @Override 
    public void addRequestToStack(Call<?> call) { 
     addRequest(call); 
    } 
} 

DashboardComponent:

package com.example.app.di.component; 

import com.example.app.di.module.DashboardModule; 
import com.example.app.di.scope.Fragment; 
import com.example.app.presenter.dashboard.DashboardPresenter; 
import com.example.app.ui.dashboard.DashboardView; 
import com.example.app.ui.dashboard.FragmentDashboard; 

import dagger.Component; 

/** 
* Created by on 31-05-2017. 
*/ 
@Fragment 
@Component(modules = DashboardModule.class, dependencies = AppComponent.class) 
public interface DashboardComponent { 

    /* BASE */ 
    void inject(FragmentDashboard fragmentDashboard); 

    /* DASHBOARD */ 
    DashboardView providesDashboardView(); 
    DashboardPresenter providesDashboardPresenter(); 

} 

ダッシュボードモジュール:

package com.example.app.di.module; 

import com.example.app.di.scope.Fragment; 
import com.example.app.ui.dashboard.DashboardView; 

import dagger.Module; 
import dagger.Provides; 

/** 
* Created by on 31-05-2017. 
*/ 
@Module 
public class DashboardModule { 

    private DashboardView view; 

    public DashboardModule(DashboardView view) { 
     this.view = view; 
    } 

    @Fragment 
    @Provides 
    public DashboardView providesDashboardView() { 
     return view; 
    } 


} 

私が作成したクラス/インタフェースのすべての下に見つけてください。DashboardPresenter:

package com.example.app.presenter.dashboard; 

import com.example.app.base.BasePresenter; 
import com.example.app.databinding.FragmentDashboardBinding; 
import com.example.app.databinding.FragmentLoginBinding; 

/** 
* Created by on 31-05-2017. 
*/ 
public interface DashboardPresenter extends BasePresenter<FragmentDashboardBinding> { 
} 

DashboardPresenterImpl:

package com.example.app.presenter.dashboard; 

import android.content.Intent; 
import android.view.MotionEvent; 
import android.view.View; 

import com.massivedisaster.activitymanager.ActivityFragmentManager; 
import com.example.app.api.ApiListener; 
import com.example.app.base.ActivityFullScreen; 
import com.example.app.databinding.FragmentDashboardBinding; 
import com.example.app.databinding.FragmentLoginBinding; 
import com.example.app.presenter.dashboard.DashboardPresenter; 
import com.example.app.ui.login.LoginView; 
import com.example.app.ui.main.FragmentMain; 
import com.example.app.util.ApiManager; 
import com.example.app.util.OnOneClickListener; 
import com.example.app.util.OnTouchListener; 
import com.example.app.util.SnackbarHandler; 
import com.example.app.util.ViewHelper; 
import com.example.app.util.factory.LoginFactory; 

import java.util.ArrayList; 

/** 
* Created by on 31-05-2017. 
*/ 
public class DashboardPresenterImpl implements DashboardPresenter { 

    private ApiManager apiManager; 
    private FragmentDashboardBinding fragmentBinding; 
    private LoginFactory loginFactory; 
    private LoginView loginView; 
    private ViewHelper viewHelper; 

    public DashboardPresenterImpl(ApiManager apiManager, LoginFactory loginFactory, LoginView loginView, ViewHelper viewHelper) { 
     this.apiManager = apiManager; 
     this.loginFactory = loginFactory; 
     this.loginView = loginView; 
     this.viewHelper = viewHelper; 
    } 

    @Override 
    public void initialize(FragmentDashboardBinding fragmentBinding) { 
     this.fragmentBinding = fragmentBinding; 

     this.fragmentBinding.btnLogin.setOnClickListener(new OnLoginClickListener()); 

     // apply on touch cleanup to view and all elements within view 
     ArrayList<View> touchables = fragmentBinding.getRoot().getTouchables(); 
     touchables.add(fragmentBinding.getRoot()); 
     for (View v : touchables) { 
      v.setOnTouchListener(new OnTouchListener() { 
       @Override 
       public boolean onTouch(View view, MotionEvent motionEvent) { 
        return super.onTouch(view, motionEvent); 
       } 
      }); 
     } 
    } 


    // main login listener 
    private class OnLoginClickListener extends OnOneClickListener { 

     @Override 
     public void doOnClick(View view) { 
      Intent intent = ActivityFragmentManager.getIntent(loginView.getActivity(), ActivityFullScreen.class, FragmentMain.class); 

      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 

      loginView.getActivity().startActivity(intent); 
     } 
    } 


} 

DashboardView:

package com.example.app.ui.dashboard; 

import com.example.app.base.RequestView; 

/** 
* Created by on 31-05-2017. 
*/ 
public interface DashboardView extends RequestView { 

} 

フラグメントダッシュボード:

package com.example.app.ui.dashboard; 

import com.example.app.R; 
import com.example.app.base.AbstractRequestFragment; 
import com.example.app.databinding.FragmentDashboardBinding; 
import com.example.app.di.component.AppComponent; 
import com.example.app.di.component.DaggerDashboardComponent; 
import com.example.app.di.module.DashboardModule; 
import com.example.app.presenter.dashboard.DashboardPresenter; 
import com.example.app.ui.dashboard.DashboardView; 

import javax.inject.Inject; 

import retrofit2.Call; 

/** 
* Created by on 31-05-2017. 
*/ 
public class FragmentDashboard extends AbstractRequestFragment<FragmentDashboardBinding> implements DashboardView { 

    @Inject 
    DashboardPresenter dashboardPresenter; 

    @Override 
    protected int layoutToInflate() { 
     return R.layout.fragment_dashboard; 
    } 

    @Override 
    protected void injectComponent(AppComponent appComponent) { 
     DaggerDashboardComponent.builder() 
       .appComponent(appComponent) 
       .dashboardModule(new DashboardModule(this)) 
       .build() 
       .inject(this); 
    } 

    @Override 
    protected void initializePresenter(FragmentDashboardBinding fragmentDashboardBinding) { 
     dashboardPresenter.initialize(fragmentDashboardBinding); 
    } 

    @Override 
    public void addRequestToStack(Call<?> call) { 
     addRequest(call); 
    } 
} 

誰も私がここで行方不明です何を言うことはできますか?

答えて

0

インターフェイスDashboardPresenterを挿入しようとしました。しかし、必要な実装がわからないため、daggerはインターフェイスの依存関係を満たすことができません。 この問題を回避するには、2つの方法があります。@Provide @Binds

@Binds 
abstract DashboardPresenter provideDashboardPresenter(DashboardPresenterImpl impl); 

DashboardPresenterImplのコンストラクタに@Injectを追加して

@Provides 
public DashboardPresenter providesDashboardPresenter() 
{ 
    return new DashboardPresenterImpl(...); 
} 

ソリューション2と

ソリューション1 。ダガーがコンストラクタの依存関係を構築できること、またはモジュール内の@Provideを介してインスタンスを提供できることを確認してください。

public class DashboardPresenterImpl implements DashboardPresenter { 

    private ApiManager apiManager; 
    private FragmentDashboardBinding fragmentBinding; 
    private LoginFactory loginFactory; 
    private LoginView loginView; 
    private ViewHelper viewHelper; 

    @Inject 
    public DashboardPresenterImpl(ApiManager apiManager, LoginFactory loginFactory, LoginView loginView, ViewHelper viewHelper) { 
     this.apiManager = apiManager; 
     this.loginFactory = loginFactory; 
     this.loginView = loginView; 
     this.viewHelper = viewHelper; 
    } 
} 

Ignacio Tomas Crespoが既に言ったようなエラーが多分あります。ですから、より多くの情報を提供し、コンパイラエラーを表示してください。

+0

私はprovideDashboardPresenterメソッドが欠けていましたが、後でそれを認識しました。私はそれを掲示した後にその方法を逃したことを認識しました。これは正しい答えです:)とにかく助けてくれてありがとう – BlunT

0
  • gradleで前処理を追加しましたか?たとえば、apt 'com.google.dagger:dagger-compiler:2.x'

  • コンパイラのログを確認する必要があります。ダガーがエラーを検出した場合、すべてのダガーコンパイルは失敗します。 Daggerはコンパイラのエラーを詳述するのにあまり親切ではありませんが、daggerファイルにエラーのリストが表示され、そのうちの1つ(通常は最初のもの)がdaggeがクラスを生成していない実際の原因を示します。

関連する問題