Dagger:为什么匕首需要@inject构造函数来处理不依赖于另一个对象的对象

时间:2017-06-21 08:35:58

标签: android dagger-2 dagger android-architecture-lifecycle

我想我错过了什么。我收到这个错误:

PostsVM cannot be provided without an @Inject constructor or from an 
@Provides-annotated method.

假设课程如下:

@Module
public class AppModule {
    private final Application mApplication;

    @Singleton
    @Provides
    ViewModel provideListViewModel() {
        return new PostsVM();
    }
}

班级 PostVM

@Singleton
public class PostsVM extends ViewModel {

    public boolean get(){
        return true;
    }
}

还有一个组件:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

    void inject(Global global);

    void inject(MainActivity mainActivity);

    @Architecture.ApplicationContext
    Context getContext();

    Application getApplication();
}

活动中:

@Inject
public         ViewModelProvider.Factory factory;

@Override
protected void onCreate(Bundle savedInstanceState) {
    InjectorClass.inject(this);

正如您所看到的,为PostVM类提供的示例并不依赖于任何内容,为什么我需要一个@inject构造函数?

1 个答案:

答案 0 :(得分:2)

tl; dr 为了防止错误并遵循惯例。

@Inject的JavaDoc中,您可以阅读:

  

可注入的构造函数使用@Inject注释,并接受零个或多个依赖项作为参数。 @Inject可以应用于每个类最多一个构造函数。

遵循惯例/文档总是很好的做法。

所以@Inject标志着Dagger的入口点,以表明它如何以及在何处创建你的类。这清楚地表明了你打算如何使用你的课程。

  • 如果您有多个构造函数怎么办?
  • 如果您需要其他设置并应使用@Module而不是
  • ,该怎么办?

通过默认为无参数构造函数(如果可能的话),事情可能很容易开始破坏,如果您只是假设Dagger完成其工作,您可能无法轻易查明来源。

__ cannot be provided without an @Inject constructor or from an @Provides-annotated method.

另一方面,这个错误会给你一个强烈的信号,表明你错过了某些东西而且不容忽视。