Кинжал 2 наследственная деятельность и фрагменты - PullRequest
0 голосов
/ 10 января 2020

Я использую кинжал 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]

Как использовать кинжал в моей архитектуре?

...