【问题标题】:Android Clean MVVM With Dagger 2带有 Dagger 2 的 Android 清洁 MVVM
【发布时间】:2017-07-03 08:22:42
【问题描述】:

我刚刚回到 Java 和 Android 世界。 在寻找可以利用编译时间 DI 和 MvvM 的良好项目启动器时,我发现了这两个:

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

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

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

}

最后具体的Activity是:

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)

我错过了什么?

谢谢!

【问题讨论】:

  • 该错误表明此类activities.dashboard.DashboardViewModel 必须具有带有@Inject 的带注释的构造函数,或者您需要在提供所述类的模块之一中具有@Provides 方法。那么这些你都做过了吗?
  • DashboardViewModel的构造函数中,在顶部添加@Inject。那应该可以解决它。

标签: android mvvm dependency-injection dagger-2 android-mvvm


【解决方案1】:

要使用带有匕首的 MVVM,请查看来自 google 的 this sample code

它确实做得很好,它也使用了 dagger 的最新趋势,比如定义子模块和使用新的AndroidInjection 来注入活动和片段。它还使用自定义工厂来创建负责注入构造函数字段的视图模型。

【讨论】:

  • 但是这个项目是用 Kotlin 开发的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2020-06-18
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多