Ich bin gerade zurück auf die Java & Android Welt. Auf der Suche nach einem guten Projekt Startern, die Kompilierung DI und mvvm nutzen wird, fand ich diese beiden:Android sauber MVVM mit Dolch 2
Nun zu meinem Problem ... I‘ d möchte eine Basisaktivität so aussehen lassen (die wichtigen Teile behalten):
public abstract class ViewModelActivity<VM extends IViewModel> extends AppCompatActivity {
private ActivityComponent activityComponent;
@Inject
private VM viewModel;
protected void inject(AppComponent appComponent) {
appComponent.inject(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppComponent appComponent = ((MvvmApplication) getApplication()).getAppComponent();
inject(appComponent);
activityComponent =
DaggerActivityComponent.builder()
.appComponent(appComponent)
.activityModule(new ActivityModule(this))
.build();
ViewModel.State savedViewModelState = null;
if (savedInstanceState != null) {
savedViewModelState = savedInstanceState.getParcelable(EXTRA_VIEW_MODEL_STATE);
}
viewModel = createViewModel(savedViewModelState);
}
}
Und so mein AppComponent sollte wie folgt aussehen:
@AppScope
@Component(modules = {
AppContextModule.class,
AppModule.class,
NetworkModule.class,
GsonModule.class
})
public interface MyAppComponent extends AppComponent {
void inject(DashboardActivity baseActivity);
Picasso picasso();
}
Wo AppComponent ist:
@AppScope
public interface AppComponent {
Context appContext();
void inject(ViewModelActivity viewModelActivity);
}
Und schließlich die konkrete Aktivität:
public class DashboardActivity extends ViewModelActivity<DashboardViewModel> {}
Jetzt halte ich folgende Fehlermeldung erhalten:
Error:(29, 10) error: activities.dashboard.DashboardViewModel cannot be
provided without an @Inject constructor or from an @Provides- or @Produces-
annotated method. This type supports members injection but cannot be
implicitly provided.
activities.dashboard.DashboardViewModel is injected at
mvvm.activity.ViewModelActivity.viewModel
activities.dashboard.DashboardActivity is injected at
app.inject(baseActivity)
Was bin ich falsch singen?
Danke!
Der Fehler sagt, dass diese Klasse '' activities.dashboard.DashboardViewModel'' hat entweder einen kommentierten Konstruktor hat mit '' @ Inject'', oder dass Sie ein '' @ Provides'' Verfahren in einer haben brauchen Ihre Module, die diese Klasse bereitstellen. Hast du so etwas getan? – Fred
Mögliches Duplikat von [Wie repariere ich den Dagger 2 Fehler '... kann nicht bereitgestellt werden \ [... \]'?] (Https://stackoverflow.com/questions/44912080/how-doi-i-fix- dagger-2-error-not-provided) –
Fügen Sie in der Konstruktorfunktion von "DashboardViewModel" @Inject hinzu. Das sollte es beheben. –