Кинжал: почему кинжалу нужен конструктор @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.
Эта ошибка, с другой стороны, дает вам сильный сигнал о том, что вы что-то упустили и не могут быть проигнорированы.