Intereting Posts
Сортировка данных Firebase Desc в Android Уменьшите размер изображения, не теряя его качества в Android Как получить доступ к `this` внутри renderRow ListView? Как отфильтровать только соответствующие мультимедийные файлы в Android? В чем разница между SQLite и SQL Как подготовить KML-файл для Android Emulator Control? Не определены ли методы, включенные в окончательный исполняемый файл? Правильный подход к веб-службе вызовов (API) из класса фрагментов Как просмотреть данные, хранящиеся в sqlite в студии android, используя genymotion в качестве эмулятора Самая странная ошибка Android когда-либо – Возможно, проблема ProGuard? Android – утечка памяти при динамическом создании пользовательского интерфейса с фоном ресурсов изображения Самый быстрый и эффективный способ поиска 3-х чисел? Android: как подключиться к телефону? Airpush для Android – Что такое факт и какой миф? Android: отключить выделение в GridView

Кинжал 2.10 / 2.11 инъекции

Я пытаюсь, безуспешно, вводить Activity в класс ViewUtils. Я следил за несколькими разными сообщениями, но я не могу понять, чего мне не хватает в моей реализации.

Я знаю, что это, вероятно, повторение сообщений ниже, и я действительно извиняюсь за это, но я честно не вижу, что мне не хватает. Это сообщения, которые я нашел:

  • Dagger 2.10 Подкомпоненты и разработчики Android
  • Как создать собственные модули с областью действия в кинжале 2.10
  • https://google.github.io/dagger/subcomponents.html

Моя реализация такова:

AppComponent

@Component(modules = { AppModule.class, AndroidSupportInjectionModule.class, ActivityBindingModule.class }) @Singleton public interface AppComponent extends AndroidInjector<EmblyApp> { @Component.Builder abstract class Builder extends AndroidInjector.Builder<EmblyApp> {} } 

ActivityBindingModule

 @Module public abstract class ActivityBindingModule { @ContributesAndroidInjector abstract LoginActivity loginActivity(); } 

LoginSubcomponent

 @Subcomponent(modules = LoginSubcomponent.LoginActivityModule.class) public interface LoginSubcomponent extends AndroidInjector<LoginActivity> { @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<LoginActivity> {} @Module abstract class LoginActivityModule { @Binds abstract Activity bindActivity(LoginActivity activity); @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) { return new ViewUtils(activity); } } } 

ViewUtils

 public class ViewUtils { private final Activity activity; @Inject public ViewUtils(Activity activity) { this.activity = activity; } } 

И ошибка, которую я получаю, такова:

 Error:(14, 22) error: [dagger.android.AndroidInjector.inject(T)] android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method. android.app.Activity is injected at com.emblyapp.app.ui.helpers.ViewUtils.<init>(activity) com.emblyapp.app.ui.helpers.ViewUtils is injected at com.emblyapp.app.ui.authentication.login.LoginActivity.viewUtils com.emblyapp.app.ui.authentication.login.LoginActivity is injected at dagger.android.AndroidInjector.inject(arg0) 

Что здесь не так? Спасибо за помощь!

Редактировать: я забыл упомянуть, что мой LoginActivity имеет инъекцию с AndroidInjection

 @Override protected void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); } 

Solutions Collecting From Web of "Кинжал 2.10 / 2.11 инъекции"

Как указано в документации к кинжалу android :

Pro-tip: Если ваш подкомпонент и его построитель не имеют других методов или супертипов, чем те, которые указаны в шаге 2, вы можете использовать @ContributesAndroidInjector, чтобы сгенерировать их для вас. Вместо шагов 2 и 3 добавьте метод абстрактного модуля, который возвращает вашу активность, аннотирует его с помощью @ContributesAndroidInjector и укажет модули, которые вы хотите установить в подкомпонент. Если подкомпонент нуждается в областям, примените также аннотации области к методу.

Таким образом, мы можем избавиться от LoginSubcomponent и выполнить следующие изменения в ActivityBindingModule :

@Module public abstract class ActivityBindingModule { @ActivityScope @ContributesAndroidInjector(modules = LoginActivityModule.class) abstract LoginActivity loginActivity(); }
@Module public abstract class ActivityBindingModule { @ActivityScope @ContributesAndroidInjector(modules = LoginActivityModule.class) abstract LoginActivity loginActivity(); } 

LoginActivityModule.java

@Module abstract class LoginActivityModule { @Binds abstract Activity bindActivity(LoginActivity activity); @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) { return new ViewUtils(activity); } }
@Module abstract class LoginActivityModule { @Binds abstract Activity bindActivity(LoginActivity activity); @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) { return new ViewUtils(activity); } } 

Ваш собственный класс приложений:

public class MyApp extends DaggerApplication { @Inject DispatchingAndroidInjector dispatchingActivityInjector; @Override protected AndroidInjector applicationInjector() { return DaggerAppComponent.builder().create(this); } }
public class MyApp extends DaggerApplication { @Inject DispatchingAndroidInjector dispatchingActivityInjector; @Override protected AndroidInjector applicationInjector() { return DaggerAppComponent.builder().create(this); } }