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.
Merci! C'est compiler sans erreur maintenant. – Ali
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
try 'homeComponent = DaggerHomeComponent.builder(). HomeModule (nouveau HomeModule (this)). Build();' – Benjamin