[英]How to inject Context in non-activity class?
我試圖在非活動類中注入Context。 在我的情況下,我試圖注入Model類(來自MVP模式)。 我需要Context來從資源中獲取字符串。 方法result()返回Observable,它返回ViewModel,它是修改后的API模型。 ViewModel用於在MainActivity中顯示。 我嘗試了這段代碼,但Context是null,我認為它不是注入的。
public class MainActivityModel implements MainActivityMVP.Model {
@Inject
Context context;
private Repository repository;
public MainActivityModel(Repository repository) {
((App) getApplication()).getComponent().inject(this); //Cannot resolve getApplication() method :(
this.repository = repository;
}
@Override
public Observable<List<ViewModel>> result(String username) {
return repository.getRepositories(username).map(new Func1<List<Repository>, List<ViewModel>>() {
@Override
public List<ViewModel> call(List<Repository> repositories) {
List<ViewModel> viewModelList = new ArrayList<ViewModel>();
for (Repository repository : repositories) {
// here Context is null
viewModelList.add(new ViewModel(context.getString(R.string.repository) + repository.getName()));
}
return viewModelList;
}
});
}
}
這是Component類,其中有注入(MainActivityModel目標)方法,我無法使用注入MainActivityModel,因為getApplication不可用於非Activity類:
@Singleton
@Component(modules = {ApplicationModule.class, MainActivityModule.class, GithubApiModule.class})
public interface ApplicationComponent {
void inject(MainActivity target);
void inject(MainActivityModel target);
}
我認為Context可以通過result(String username,Context context)方法發送。 但是如果我將Context作為方法參數傳遞,那么Dependency Injection的含義是什么? 也許我誤解了DI的基本概念。
所以我的問題是:是否有可能在非活動類中注入Context? 或者它應該作為方法參數傳遞?
要注入Context,您需要使用provide方法編寫一個模塊:
@Module (injects = {MainActivityModel.class})
public class RootModule {
private Context context;
public RootModule(App application) {
this.context = application.getApplicationContext();
}
@Provides
@Singleton
Context provideContext() {
return context;
}
}
在您的自定義App類中:
public class App extends Application {
public ObjectGraph objectGraph;
@Override
public void onCreate() {
super.onCreate();
objectGraph = ObjectGraph.create(getInjectionModule());
}
protected Object getInjectionModule() {
return new RootModule(this);
}
}
並注入模型的構造函數:
public MainActivityModel(Repository repository) {
((App) getApplication()).objectGraph.inject(this);
this.repository = repository;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.