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,这不是共享应用程序范围依赖项的最佳方式;您应该创建一个继承自 AppComponent
的 Component
并使 AppComponent
公开所需的共享依赖项。
现在让我们看看您的模块 class:
@Module
public class NetModule {
@Provides @Singleton
public NetworkingManager provideNetworkingManager(Application application) {
return new NetworkingManager(application);
}
}
给你 @Provide
NetworkingManager
,没关系。您的 NetworkingManager
需要一个 Application
(实际上是一个 Context
),为什么不在 NetworkingManager
内提供 App
?,或者更好的是为什么不提供 NetworkingManager
在 AppModule
里面,因为 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
。
今天刚开始使用 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,这不是共享应用程序范围依赖项的最佳方式;您应该创建一个继承自 AppComponent
的 Component
并使 AppComponent
公开所需的共享依赖项。
现在让我们看看您的模块 class:
@Module
public class NetModule {
@Provides @Singleton
public NetworkingManager provideNetworkingManager(Application application) {
return new NetworkingManager(application);
}
}
给你 @Provide
NetworkingManager
,没关系。您的 NetworkingManager
需要一个 Application
(实际上是一个 Context
),为什么不在 NetworkingManager
内提供 App
?,或者更好的是为什么不提供 NetworkingManager
在 AppModule
里面,因为 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
。