Android Clean MVVM与匕首2

问题描述:

我刚刚回到了Android的世界Java &。 我在寻找一个好项目启动,将充分利用编译时间DI和MVVM,我发现这两个:Android Clean MVVM与匕首2

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

现在我的问题...... 我d喜欢做一个基本活动看起来像这样(保留重要部分):

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

} 

所以我的AppComponent应该是这样的:

@AppScope 
@Component(modules = { 
    AppContextModule.class, 
    AppModule.class, 
    NetworkModule.class, 
    GsonModule.class 
}) 
public interface MyAppComponent extends AppComponent { 

    void inject(DashboardActivity baseActivity); 

    Picasso picasso(); 

} 

其中AppComponent是:

@AppScope 
public interface AppComponent { 

    Context appContext(); 

    void inject(ViewModelActivity viewModelActivity); 

} 

最后具体活动为:

public class DashboardActivity extends ViewModelActivity<DashboardViewModel> {} 

现在我不断收到以下错误:

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) 

我是什么唱?

谢谢!

+2

错误提示此类“activities.dashboard.DashboardViewModel”必须带有“@Inject”注解的构造函数,或者您需要在其中一个“@Project”方法提供上述课程的模块。那么你有没有做过这些? – Fred

+0

可能的重复[如何解决Dagger 2错误'...不能提供\ [... \]'?](https://stackoverflow.com/questions/44912080/how-doi-i-fix- dagger-2-error-can-be-provided) –

+0

在DashboardViewModel的构造函数中,在顶部添加@Inject。这应该解决它。 –

要使用匕首结帐时使用MVVM此示例代码从谷歌

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

它真的做到了非常好,它使用匕首的最新趋势,以及像定义子模块,并使用新的AndroidInjection注射活动片段。它还使用自定义工厂来创建视图模型,该模型负责注入构造器字段。