Android Dagger 2 POJO字段注入null

时间:2015-05-29 23:50:52

标签: android dependency-injection dagger-2

今天刚刚开始使用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%确定我的设置有问题,但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:10)

根据您的评论,您希望在应用程序的任何位置都可以使用NetworkingManager

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

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

这告诉Dagger这个组件将注入App类。现在,您还可以告诉Dagger您想要注入的其他课程。因此,如果您还要注入一个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分享应用程序范围依赖关系的最佳方式;您应该创建一个继承自Component的{​​{1}},并使AppComponent公开所需的共享依赖项。

现在让我们看看你的模块类:

AppComponent

在这里@Module public class NetModule { @Provides @Singleton public NetworkingManager provideNetworkingManager(Application application) { return new NetworkingManager(application); } } @Provide,这很好。您的NetworkingManager需要NetworkingManager(真的是Application),为什么不在Context内提供App,或者更好的是为什么不提供NetworkingManager NetworkingManager以内的AppModuleAppModule @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 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; } } {/ 1}}

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 = {...})

在我们假设的dependencies

Component

您似乎没有正确使用http://www.example.com/products/cat1/1000.html?p=1。当您想使用我上面提到的机制将依赖关系从一个http://www.example.com/products/cat2/1000.html?p=2公开给另一个时,使用http://www.example.com/products/cat2/all.html