Android,由于错误“无法在没有@Inject构造函数的情况下无法提供活动”,因此无法集成Dagger2。

时间:2019-03-02 06:14:43

标签: 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)创建“连接”界面:

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 :(得分:1)

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

  1. 您必须将模块纳入此处component = DaggerAppComponent.create();
  2. Dagger不会注入私有字段。

p1的示例:

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