Android,由于错误 “Activity cannot be provided without an @Inject constructor ” 无法集成 Dagger2

标签 android dagger-2

我想集成 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)创建“连接”接口(interface):

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 到 manifest:

 <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 的错误,但我不明白在哪里以及如何修复它。

更新:

这个修改没有帮助:

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

最佳答案

您的代码有两个问题,一个导致您遇到错误。

  1. 您必须在此处将模块包含到构建中 component = DaggerAppComponent.create();
  2. Dagger 不会注入(inject)私有(private)字段。

p1 的例子:

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

关于Android,由于错误 “Activity cannot be provided without an @Inject constructor ” 无法集成 Dagger2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54955755/

相关文章:

android - 如何在 Fragment 中重用 onNewIntent() 方法?

java - 如何使用 Content Provider 实现复杂的查询?

android - 显示两个不同的Toast

android - 我的 Android 应用程序不断崩溃

如果没有 Provides-annotated 方法,则无法提供 Android dagger

android - 覆盖 Adapter.getView

android - Proguard 剥离了实现接口(interface)。运行时引发 java.lang.IncompleteClassChangeError

java - Dagger2 - 在不复制代码的情况下注入(inject)替换模块

android - Dagger 2、Cicerone、Kotlin - 注入(inject)问题

android - Dagger :IllegalArgumentException:没有注入(inject)器工厂绑定(bind)到类