Android Dagger 2 POJO 字段注入空

Android Dagger 2 POJO field Inject null

今天刚开始使用 Dagger 2,我对我究竟需要如何设置一切感到困惑。

我正在尝试注入 POJO,但它始终为空。 首先,一些代码:

App.java

private AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
}

public AppComponent component() {
    return appComponent;
}

AppModule.java

@Module
public class AppModule {
    private Application app;

    public AppModule(Application app) {
        this.app = app;
    }

    @Provides @Singleton
    public Application application() {
        return app;
    }
}

AppComponent.java

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
    Application application();
}

NetworkingManager.java

@Singleton
public class NetworkingManager {
    private Context ctx;

    @Inject
    public NetworkingManager(Context context) {
        this.ctx = context;
    }
}

NetModule.java

@Module
public class NetModule {
    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

NetComponent.java

@Singleton
@Component(modules = {NetModule.class},
        dependencies = {AppModule.class})
public interface NetComponent {
    void inject(NetworkingManager networkingManager);
}

SomeClass.java

@Inject
NetworkingManager networkingManager;

public void doSomethingWithNetworkManager() {
    networkManager.doStuff();
}

我花了很多时间查看大量教程、SO 问题和示例,但我一直无法弄清楚我做错了什么。

我 99% 确定我的设置有问题,但我一直无法弄清楚是什么。

根据您的评论,您希望 NetworkingManager 在您的应用程序中随处可用。

让我们从您对 Component 的定义开始:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
}

这告诉 Dagger 该组件将注入 App class。现在,您还可以在这里告诉 Dagger 您想要注入的其他 classes。因此,如果您还想注入一个 Activity,例如您可以添加:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
    void inject(MainActivity activity) //Where MainActivity is a class that extends Activity.
}

请注意,IMO,这不是共享应用程序范围依赖项的最佳方式;您应该创建一个继承自 AppComponentComponent 并使 AppComponent 公开所需的共享依赖项。

现在让我们看看您的模块 class:

@Module
public class NetModule {
    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

给你 @ProvideNetworkingManager,没关系。您的 NetworkingManager 需要一个 Application(实际上是一个 Context),为什么不在 NetworkingManager 内提供 App?,或者更好的是为什么不提供 NetworkingManagerAppModule 里面,因为 AppModule 应该 @Provide 整个 Application:

的东西
@Module
public class AppModule {
    private Application app;

    public AppModule(Application app) {
        this.app = app;
    }

    @Provides @Singleton
    public Application application() {
        return app;
    }

    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

现在你的 App class:

public class App extends Application {
    private AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
   appComponent.inject(this);
}

public AppComponent component() {
    return appComponent;
 }
}

而在我们的假设中 MainActivity

public class MainActivity extends Activity {

private AppComponent appComponent;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    appComponent = ((App)getApplicationContext()).getAppComponent();
    appComponent.inject(this);
   }
 }

看来您没有正确使用 @Component(dependencies = {...})。当您想使用我上面提到的机制将一个 Component 的依赖项暴露给另一个 dependencies 时,使用 dependencies