Android не может интегрировать Dagger2 из-за ошибки «Невозможно обеспечить активность без конструктора @Inject» - PullRequest
0 голосов
/ 02 марта 2019

Я хочу интегрировать Dagger2, но я не могу собрать свой проект, сборка завершилась неудачно:

error: com.example.animalslibrary.ui.home.activity.HomeActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method.
com.example.animalslibrary.ui.home.activity.HomeActivity is injected at
com.example.animalslibrary.AppComponent.injectsHomeActivity(homeActivity)

Я искал ответ около 3 часов и сейчас прошу у вас помощи.

Мои действия шаг за шагом:

1) Добавить зависимости в Gradle:

implementation 'com.google.dagger:dagger:2.7'
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'

2) Создать пустой тестовый класс NetworkUtils:

public class NetworksUtils {
}

3) Создайте для него модуль:

@Module
public class NetworksModule {
    @Provides
    NetworksUtils provideNetworksUtils() {
        return new NetworksUtils();
    }
}

4) Создайте интерфейс «подключения»:

import dagger.Component;

@Component(modules = NetworksModule.class)
public interface AppComponent {
    void injectsHomeActivity(HomeActivity homeActivity);
}

5) Создайте App класс.Я не совсем понимаю, почему я это сделал (преподавание в путеводителе), точно не понимаю, почему мне нужно продлить на Application.Может быть, создать все компоненты при запуске приложения.DaggerAppComponent красного цвета, из-за сбоя при сборке этот класс еще не создан.

public class App extends Application {
    private static AppComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        component = DaggerAppComponent.create();
    }

    public static AppComponent getComponent() {
        return component;
    }
}

6) Добавьте App в манифест:

 <application
        android:name="com.example.animalslibrary.ui.App"
        ...

7) Сейчася пишу свой HomeActivity класс ...

public class HomeActivity extends AppCompatActivity implements 
HomeContract.View {
...
@Inject
private NetwotkUtils netwotkUtils;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    ...
    App.getComponent().injectsHomeActivity(this);
    ...
    }

8) ... и отключается при попытке построить проект.

Я думаю, что моя ошибка о App, но яне могу понять, где и как это исправить.

UPD:

Эта модификация не помогла:

public class NetwotkUtils {
    @Inject
    public NetwotkUtils() {
    }
}

1 Ответ

0 голосов
/ 02 марта 2019

Есть две проблемы с вашим кодом, и одна приводит к ошибке, которую вы получаете.

  1. Вы должны включить свой модуль в сборку здесь component = DaggerAppComponent.create();
  2. Кинжал НЕ являетсявнедрение в приватные поля.

Пример p1:

DaggerAppComponent.builder()
   .networkModule(new NetworkModule())
   .build()
...