Кинжал: почему кинжалу нужен конструктор @inject для объекта, который не зависит от другого объекта

Я думаю, что что-то упустил. Я получаю эту ошибку:

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 ответ

Решение

tl;dr Предотвратить ошибки и следовать соглашению.


Из JavaDoc @Inject ты можешь читать:

Инъецируемые конструкторы аннотируются @Inject и принимают ноль или более зависимостей в качестве аргументов. @Inject может применяться не более чем к одному конструктору на класс.

И всегда хорошо следовать правилам / документации.


Так @Inject отмечает точку входа для Dagger, чтобы указать, как и где создать свой класс. Это явный признак того, как вы собираетесь использовать свой класс.

  • Что если у вас есть несколько конструкторов?
  • Что делать, если вам требуется дополнительная настройка и следует использовать @Module вместо?

Если по умолчанию использовать конструктор без аргументов (если это возможно), все может начать очень легко ломаться, и вы не сможете легко определить источник, если просто предположите, что Dagger выполняет свою работу.

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

Эта ошибка, с другой стороны, дает вам сильный сигнал о том, что вы что-то упустили и не могут быть проигнорированы.

Другие вопросы по тегам