Jor*_*ndo 6 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;
}
Run Code Online (Sandbox Code Playgroud)
AppModule.java
@Module
public class AppModule {
private Application app;
public AppModule(Application app) {
this.app = app;
}
@Provides @Singleton
public Application application() {
return app;
}
}
Run Code Online (Sandbox Code Playgroud)
AppComponent.java
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(App application);
Application application();
}
Run Code Online (Sandbox Code Playgroud)
NetworkingManager.java
@Singleton
public class NetworkingManager {
private Context ctx;
@Inject
public NetworkingManager(Context context) {
this.ctx = context;
}
}
Run Code Online (Sandbox Code Playgroud)
NetModule.java
@Module
public class NetModule {
@Provides @Singleton
public NetworkingManager provideNetworkingManager(Application application) {
return new NetworkingManager(application);
}
}
Run Code Online (Sandbox Code Playgroud)
NetComponent.java
@Singleton
@Component(modules = {NetModule.class},
dependencies = {AppModule.class})
public interface NetComponent {
void inject(NetworkingManager networkingManager);
}
Run Code Online (Sandbox Code Playgroud)
SomeClass.java
@Inject
NetworkingManager networkingManager;
public void doSomethingWithNetworkManager() {
networkManager.doStuff();
}
Run Code Online (Sandbox Code Playgroud)
我花了很多时间查看大量的教程,SO问题和示例,但我无法弄清楚我做错了什么.
我99%肯定我有一些设置错误,但我无法弄清楚是什么.
Emm*_*uel 10
根据您的评论,您希望NetworkingManager
在您的应用程序中随处可用.
让我们从你的定义开始Component
:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(App application);
}
Run Code Online (Sandbox Code Playgroud)
这告诉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.
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是IMO共享应用程序范围依赖关系的最佳方式; 你应该创建一个Component
继承自AppComponent
并AppComponent
公开所需共享依赖项的东西.
现在让我们来看看你的模块类:
@Module
public class NetModule {
@Provides @Singleton
public NetworkingManager provideNetworkingManager(Application application) {
return new NetworkingManager(application);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,你是@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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在在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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我们的假设中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);
}
}
Run Code Online (Sandbox Code Playgroud)
看来你没有@Component(dependencies = {...})
正确使用.dependencies
当你想Component
使用我上面提到的机制将依赖关系从一个暴露给另一个时使用.
归档时间: |
|
查看次数: |
5237 次 |
最近记录: |