我正在尝试注入一个POJO,但它总是为空.
首先,一些代码:
App.java
private AppComponent appComponent;@OverrIDepublic voID onCreate() { super.onCreate(); appComponent = DaggerAppComponent .builder() .appModule(new AppModule(this)) .build();}public AppComponent component() { return appComponent;}
AppModule.java
@Modulepublic 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
@Singletonpublic class NetworkingManager { private Context ctx; @Inject public NetworkingManager(Context context) { this.ctx = context; }}
NetModule.java
@Modulepublic 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
@InjectNetworkingManager networkingManager;public voID doSomethingWithNetworkManager() { networkManager.doStuff();}
我花了很多时间查看大量的教程,SO问题和示例,但我无法弄清楚我做错了什么.
我99%肯定我有一些设置错误,但我无法弄清楚是什么.
解决方法 根据您的评论,您希望在您的应用程序中随处可用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共享应用程序范围依赖关系的最佳方式;您应该创建一个继承自AppComponent的Component,并使AppComponent公开所需的共享依赖项.
现在让我们来看看你的模块类:
@Modulepublic class NetModule { @ProvIDes @Singleton public NetworkingManager provIDeNetworkingManager(Application application) { return new NetworkingManager(application); }}
在这里你是@ProvIDeing一个NetworkingManager,没关系.您的NetworkingManager需要一个应用程序(真正的上下文),为什么不在NetworkingManager里面提供App,或者更好的是为什么不在AppModule中提供NetworkingManager,因为AppModule应该@ProvIDe整个应用程序常见的东西:
@Modulepublic 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;@OverrIDepublic 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暴露给另一个Component时,会使用依赖关系.
总结以上是内存溢出为你收集整理的Android Dagger 2 POJO字段注入null全部内容,希望文章能够帮你解决Android Dagger 2 POJO字段注入null所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)