Я использую кинжал 2 в своем приложении и получаю эту ошибку.
У меня базовая активность:
public abstract class QuestionBaseActivity extends DaggerAppCompatActivity implements View.OnClickListener {
protected QuestionViewPager questionsViewPager;
protected TabLayout questionTabs;
protected ProgressBar progressBar;
protected TextView questionNumber;
protected FloatingActionButton nextButton;
protected long testTime;
protected Chronometer chronometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
Дочерняя активность:
public class QuestionControlActivity extends QuestionBaseActivity implements View.OnClickListener, QuestionControlFragment.OnQuestionListener, ControlDialogFragment.OnControlDialogFragmentListener {
private QuestionControlViewModel viewModel;
private FloatingActionButton finishButton;
private Theme currentTheme;
private int correctAnswerCount = 0;
@Inject
ViewModelProviderFactory providerFactory;
@Inject
QuestionControlAdapter questionAdapter;
@Inject
ControlDialogFragment controlDialogFragment;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
Эта активность содержит фрагмент.
Базовый фрагмент:
public class QuestionBaseFragment extends DaggerFragment implements OptionViewHolder.OnOptionListener {
protected View view;
protected TextView questionText;
protected PhotoView questionImage;
protected RecyclerView options;
protected FloatingActionButton submitButton;
protected SingleQuestionViewModel viewModel;
protected int position;
protected Question question;
protected OnQuestionListener questionListener;
protected ProgressBar loadQuestionProgress;
protected Button skipQuestButton;
protected AnswerTask answerTask = new AnswerTask();
@Inject
ViewModelProviderFactory providerFactory;
@Inject
OptionAdapter optionAdapter;
@Inject
CountTimer timer;
@Inject
protected FrontCameraProvider frontCam;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_question, container, false);
position = getArguments().getInt("position");
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
}
Дочерний фрагмент, для которого требуется действие:
public class QuestionControlFragment extends QuestionBaseFragment implements View.OnClickListener, OptionViewHolder.OnOptionListener {
@Inject
QuestionControlActivity questionActivity;
public static QuestionControlFragment newInstance(int position) {
QuestionControlFragment fragment = new QuestionControlFragment();
Bundle args = new Bundle();
args.putInt("position", position);
fragment.setArguments(args);
return fragment;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
super.onViewCreated(view, savedInstanceState);
}
Для кинжала 2. Модуль построения фрагментов:
@Module
publi c абстрактный класс QuestionBaseFragmentBuilderModule {
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract QuestionBaseFragment contributeQuestionBaseFragment();
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract QuestionFragment contributeQuestionFragment();
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract InteractiveQuestionFragment contributeInteractiveQuestionFragment();
@OptionScope
@ContributesAndroidInjector(
modules = {OptionModule.class}
)
abstract QuestionControlFragment contributeQuestionControlFragment();
}
Модуль построителя активности:
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionActivity contributeQuestionActivity();
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionBaseActivity contributeQuestionBaseActivity();
@QuestionScope
@ContributesAndroidInjector (
// modules = {QuestionModule.class, QuestionViewModelsModule.class, ControlQuestionFragmentBuilderModule.class}
modules = {QuestionModule.class, QuestionViewModelsModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionControlActivity contributeQuestionControlActivity();
Ошибка сборки:
error: [Dagger/MissingBinding] com.example.nktest.ui.question.QuestionControlActivity cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
A binding with matching key exists in component: com.example.nktest.di.ActivityBuilderModule_ContributeQuestionControlActivity.QuestionControlActivitySubcomponent
com.example.nktest.ui.question.QuestionControlActivity is injected at
com.example.nktest.ui.question.QuestionControlFragment.questionActivity
com.example.nktest.ui.question.QuestionControlFragment is injected at
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionActivity.QuestionActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionBaseActivity.QuestionBaseActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionControlActivity.QuestionControlActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
Как использовать кинжал в моей архитектуре?