1

J'essaie de comprendre comment faire face à l'injection de dépendance avec Dagger 2 et l'architecture propre dans Android. Ce que je veux réaliser, c'est quand je clique sur un bouton, un message sera enregistré dans la base de données Firebase. Et montrer le message de succès à l'utilisateur. Quand je construis mon projet, je reçois cette erreur:Android Dagger 2 et la mise en œuvre de l'architecture propre, erreurs de portée

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

Voici ma classe d'application:

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


Présentateur

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


j'ai suivi des projets d'échantillons et des tutoriels, mais ne comprenait pas ce que je fais mal ici. Je ne cherche pas de projet de travail, mais je veux apprendre quelle est la meilleure pratique de ceci et comment gérer et utiliser des modules et des composants.

Répondre

4

Le problème est que votre HomeComponent n'est pas étendu tandis que votre DataModule fournit une dépendance de portée (c'est-à-dire la dépendance FirebaseDatabase).

Un composant non limité ne peut pas compter sur le fournisseur de portée. Vous devez soit supprimer le @Singleton sur votre fournisseur provideFirebaseDatabase() ou ajouter @Singleton sur votre HomeComponent.

+0

Merci! C'est compiler sans erreur maintenant. – Ali

+1

Je reçois getView() en cas d'erreur de référence null dans ce bloc: homeComponent = DaggerHomeComponent .builder() .homeModule (nouveau HomeModule (presenter.getView())) .build(); avez-vous une idée ? – Ali

+0

try 'homeComponent = DaggerHomeComponent.builder(). HomeModule (nouveau HomeModule (this)). Build();' – Benjamin