Вам нужно исправить несколько ошибок в своем коде, чтобы ваш проект компилировался.Но сначала, практическое правило для эффективного Dagger - всегда предпочитайте делать свои модули абстрактными классами с абстрактными методами @Binds или, если это невозможно, статическими методами @Provides.Это означает, что вам нужно сделать AppModule абстрактным классом, иначе ваш проект не будет компилироваться в соответствии с кодом, который вы опубликовали здесь.
Основная причина, по которой ваш код не компилируется, заключается в том, что у Puzzle нетконструктор с аннотацией @Inject:
public class Puzzle implements Toy {
@Inject // Add this
public Puzzle() {
}
@Override
public String play() {
Log.v("DaggerSample","Play with Puzzle");
return "Play with Puzzle";
}
}
Далее необходимо внести следующие изменения в этот модуль:
@Module
public class MainFragmentModule { // Make this class abstract
@Provides // Change this to @Binds instead
@FragmentScoped
Toy provideToy() // Change this method to look like this below method
{
return new Puzzle();
}
@Binds
@FragmentScoped
abstract Toy bindPuzzle(Puzzle puzzle);
}
Если у вас есть другие классы, которые реализуют интерфейс Toy, который выесли вы хотите внедрить, вам нужно будет использовать квалификаторы (аннотацию @Named), чтобы сообщить Dagger, какую реализацию внедрять.
Вы не можете вставить фрагмент в действие, в котором он размещен.Вместо этого вы должны создать фрагмент и добавить его, используя менеджер фрагментов.
public class MainActivity extends DaggerAppCompatActivity {
@Inject // Remove this
MainFragment injectedFragment; // And this if you don't use this field
Вы не можете аннотировать конструктор фрагмента с помощью @Inject.Фрагмент является компонентом Android, и компоненты Android нельзя внедрить с помощью конструктора.Единственный способ, которым вы можете внедрить компоненты Android, - это внедрение элементов, которое уже сделано для вас, если ваш фрагмент наследуется от DaggerFragment.Обратите внимание, что если вы используете фрагменты библиотеки поддержки, обязательно используйте вариант DaggerFragment из пакета поддержки.
Вы не включили свой код DaggerSample4Application, поэтому я не могу сказать, что вы делаете что-точто-то не так, но суть в том, что этот класс должен расширять DaggerApplication и реализовывать некоторые методы.У меня есть полный рабочий пример, который вы можете проверить: https://github.com/Nimrodda/dagger-androidinjector Это исходный код статьи, которую я написал о внедрении Dagger в Android * https://android.jlelse.eu/android-and-dagger-2-10-androidinjector-5e9c523679a3 Я настоятельно рекомендую вам ознакомиться с ней, чтобы лучше понять.