【问题标题】:How to inject Context in non-activity class?如何在非活动类中注入上下文?
【发布时间】:2017-04-20 22:51:07
【问题描述】:

我正在尝试在非活动类中注入上下文。就我而言,我正在尝试注入模型类(来自 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 类,其中有一个 inject(MainActivityModel target) 方法,我无法使用该方法注入 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 作为方法参数传递,那么依赖注入的含义是什么?也许我误解了 DI 的基本概念。

所以我的问题是:是否可以在非活动类中注入上下文?还是应该作为方法参数传递?

【问题讨论】:

    标签: java android dependency-injection dagger-2


    【解决方案1】:

    为了注入一个上下文,你需要编写一个带有提供方法的模块:

    @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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多