Intereting Posts
Должен ли я требовать новый токен каждый раз, когда я запускаю приложение для Android? Android – Как обращаться с двумя пальцами RecyclerView не прокручивается, как ожидалось Любой хороший пример для шейдера openGLES в android? Как добавить элементы в spinner в Android? Как Xamarin для Android (Mono для Android) отличается от разработки на базе Android? Скрыть мягкую клавиатуру при действии без каких-либо операций с клавиатурой Android: функция MediaPlayer setVolume Appium: как запустить приложение из профиля Android For Work Как изменить фоновый цвет информационной области на ImageCardView? Безопасно ли хранить имя пользователя + пароли в локальном SQLite db в Android? Как проверить, является ли JSONObject нулевым или не существует Как получить доступ к sms-почтовому ящику из javascript на Android-телефоне (phonegap) Класс FloatingActionButton не может быть создан Как я могу получить как res / values-pt_PT, так и res / values-pt_BR на Android?

Кинжал 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); } }