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