1

私はdagger 2の依存性注入とAndroidのクリーンなアーキテクチャーに対処する方法を理解しようとしています。私が達成したいのは、ボタンをクリックすると、メッセージがFirebaseデータベースに保存されるということです。また、成功メッセージをユーザーに表示します。私は私のプロジェクトをビルドするとき、私はこのエラーを取得しています:Android Dagger 2とクリーンアーキテクチャー実装、スコープエラー

Error:(10, 1) error: com.example.mvpsample.home.HomeComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.google.firebase.database.FirebaseDatabase com.example.mvpsample.data.DataModule.provideFirebaseDatabase()

ここに私のアプリのクラスを:

public class MyApp extends Application { 

    private static MyApp app; 
    private HomeComponent homeComponent; 
    private AuthenticationComponent authenticationComponent; 

    @Inject 
    Presenter presenter; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     app = this; 

     homeComponent = DaggerHomeComponent 
       .builder() 
       .homeModule(new HomeModule(presenter.getView())) 
       .build(); 
    } 

    public HomeComponent getHomeComponent() { 
     return homeComponent; 
    } 

    public static MyApp app() { 
     return app; 
    } 
} 


HomeActivity

public class HomeActivity extends AppCompatActivity implements BaseContract.View { 

    @Inject 
    public Presenter presenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

     MyApp 
       .app() 
       .getHomeComponent() 
       .inject(this); 

    } 

    @OnClick(R.id.tvHello) 
    public void clickTvHello() { 
     presenter.writeStringToDatabase("Hi"); 
    } 


    @Override 
    public void showSuccessMessage() { 
     Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show(); 
    } 
} 


HomeModule

@Module 
public class HomeModule { 

    private final BaseContract.View View; 

    @Inject 
    public HomeModule(BaseContract.View View) { 
     this.View = View; 
    } 

    @Provides 
    public BaseContract.View provideView() { 
     return View; 
    } 
} 


HomeComponent

@Component(modules = {HomeModule.class, DataModule.class}) 
public interface HomeComponent { 
    void inject(HomeActivity homeActivity); 
} 


DataModuleの

@Module 
public class DataModule { 

    @Provides 
    @Singleton 
    public FirebaseDatabase provideFirebaseDatabase() { 
     return FirebaseDatabase.getInstance(); 
    } 
} 


BaseContract

public interface BaseContract { 
    interface View { 
     void showSuccessMessage(); 
    } 

    interface Presenter { 

     View getView(); 

     void writeStringToDatabase(String string); 
    } 
} 


プレゼンター

public class Presenter implements BaseContract.Presenter { 

    private final BaseContract.View View; 

    @Inject 
    FirebaseDatabase firebaseDatabase; 

    @Inject 
    public Presenter(BaseContract.View View) { 
     this.View = View; 
    } 


    @Override 
    public BaseContract.View getView() { 
     return View; 
    } 

    @Override 
    public void writeStringToDatabase(String string) { 
     firebaseDatabase.getReference() 
       .child("messages") 
       .push() 
       .child("value") 
       .setValue(string).addOnSuccessListener(new OnSuccessListener<Void>() { 
      @Override 
      public void onSuccess(Void aVoid) { 
       getView().showSuccessMessage(); 
      } 
     }); 
    } 
} 


私は、サンプルプロジェクト、チュートリアルに従ったが、私はここで間違ってやっているのか理解しませんでした。作業中のプロジェクトを探しているわけではありませんが、私はこれのベストプラクティスと、モジュールとコンポーネントの管理と使用方法を学びたいと思っています。

答えて

4

がスコープ依存(つまり、FirebaseDatabaseの依存関係)を提供している間にHomeComponentのスコープが設定されていないという問題があります。

スコープ外のコンポーネントは、スコープ付きのプロバイダに依存できません。 provideFirebaseDatabase()プロバイダの@Singletonを削除するか、HomeComponent@Singletonを追加する必要があります。

+0

ありがとうございます!今はエラーなくコンパイルしています。 – Ali

+1

このブロックのnull参照エラーでgetView()を取得しています。homeComponent = DaggerHomeComponent .builder() .homeModule(new HomeModule(presenter.getView())) .build();何か考えていますか? – Ali

+0

'homeComponent = DaggerHomeComponent.builder()。homeModule(新しいHomeModule(this))。ビルド();' – Benjamin

関連する問題