2017-07-03 12 views
0

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

  1. Writing Testable Android MVVM
  2. Countries - A sample Android app

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!

+2

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

+0

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

+0

Fügen Sie in der Konstruktorfunktion von "DashboardViewModel" @Inject hinzu. Das sollte es beheben. –

Antwort

0

Um MVVM mit Dolch Kasse diesen Beispielcode von Google

https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample 

Es hat es wirklich sehr gut zu nutzen und verwendet die neuesten Trends in der Dolch als auch, wie Submodule definieren und neue AndroidInjection für Aktivitäten Injektion mit und Fragmente. Außerdem wird eine benutzerdefinierte Factory zum Erstellen Ihres Ansichtsmodells verwendet, das die Konstruktorfelder in die Warteschlange einbezieht.