Dagger 2演示者注入

用户1341300

我刚开始使用Dagger 2,但我在网上发现了成千上万的指南,每个指南都有不同的实现方式,现在我有些困惑。因此,基本上这是我目前所写的内容:

AppModule.java:

@Module
public class AppModule {

 Application mApplication;

 public AppModule(Application application) {
    mApplication = application;
 }

 @Provides
 @Singleton
 Application providesApplication() {
    return mApplication;
 }
}

DataModule.java:

@Module
public class DataModule {

private static final String BASE_URL = "http://beta.fridgewizard.com:9001/api/";

@Provides
@Singleton
NetworkService provideNetworkService() {
    return new NetworkService(BASE_URL);
}

@Provides
@Singleton
SharedPreferences provideSharedPreferences(Application app) {
    return PreferenceManager.getDefaultSharedPreferences(app);
}
}

PrefsModel.java:

@Module(includes = DataModule.class)
public class PrefsModel {

@Provides
@Singleton
QueryPreferences provideQuery(SharedPreferences prefs) {
    return new QueryPreferences(prefs);
}
}

AppComponent.java(由于在演示者中需要QueryPreferences对象,因此我将其公开,希望以此方式是正确的):

@Singleton
@Component(modules = {AppModule.class, DataModule.class, PrefsModel.class})
public interface AppComponent {

    void inject(HomeFragment homeFragment);

    QueryPreferences preferences();
    NetworkService networkService();
}

然后,我有了FwApplication.java:

public class FwApplication extends Application {

private static final String TAG = "FwApplication";

private NetworkService mNetworkService;

private AppComponent mDataComponent;

    @Override
    public void onCreate() {
       super.onCreate();

       buildComponentAndInject();
    }

    public static AppComponent component(Context context) {
      return ((FwApplication)   context.getApplicationContext()).mDataComponent;
    }

    public void buildComponentAndInject() {
       mDataComponent = DaggerComponentInitializer.init(this);
    }

    public static final class DaggerComponentInitializer {
      public static AppComponent init(FwApplication app) {
        return DaggerAppComponent.builder()
                .appModule(new AppModule(app))
                .dataModule(new DataModule())
                .build();
    }
   }
}

最后,我为演示者添加了另一个模块:

@Module
public class PresenterModule {

   @Provides
   Presenter<FwView> provideHomePresenter(NetworkService networkService) {
      return new HomePresenterImpl(networkService);
   }

   @Provides
   Presenter<FwView> provideSearchPresenter(NetworkService networkService) {
      return new SearchPresenterImpl(networkService);
   }

}

还有以下组件(由于我无法在此处添加范围内的依赖项,因此返回错误):

@Component(dependencies = AppComponent.class, modules = PresenterModule.class)
public interface PresenterComponent {

    void inject(HomePresenterImpl presenter);
}

因此,对于在线阅读文档,我有几个不清楚的问题:

  • 我如何解决Presenter组件中的错误,因为它取决于NetworkService,后者是AppComponent中定义的单例?
  • 我有一个HomeFragment,应该使用“ new HomePresenter(networkService)”实现HomePresenter,但是现在我不知道如何使用定义的DI

编辑-修复:

HomeFragment.java:

public class HomeFragment extends Fragment {

private static final String TAG = "FW.HomeFragment";


@Inject
HomePresenterImpl mHomePresenter;

public static HomeFragment newInstance() {
    return new HomeFragment();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FwApplication.component(getActivity()).inject(this);
}

然后,我以这种方式修改了presenter构造函数:

@Inject
public HomePresenterImpl(NetworkService networkService) {
    mNetworkService = networkService;
    mInteractor = new InteractorImpl(mNetworkService);
}

然后,将自动注入NetworkService。

我想知道这样是否正确,因为我必须调用我需要的每个片段,每个片段都需要以与以下代码上方相同的方式构造的演示者:

FwApplication.component(getActivity()).inject(this);
大卫·梅登雅克

您正在混淆。要提供演示者,您应该切换到以下内容:

如果可能,请使用构造函数注入。它将使事情变得容易得多

public class HomePresenterImpl {

    @Inject
    public HomePresenterImpl(NetworkService networkService) {
        // ...
    }

}

要提供接口,请使用此构造函数注入,并取决于实现:

Presenter<FwView> provideHomePresenter(HomePresenterImpl homePresenter) {
    return homePresenter;
}

这样,您不必自己调用任何构造函数。并实际注入演示者...

public class MyFragment extends Fragment {

    @Inject
    Presenter<FwView> mHomePresenter;

    public void onCreate(Bundle xxx) {
        // simplified. Add your modules / Singleton component
        PresenterComponent component = DaggerPresenterComponent.create().inject(this);
    }
}

这样,您将注入事物。请仔细阅读并尝试理解它。这将解决您的主要问题,但是您仍然无法从同一模块(在同一范围内)提供2个相同类型的演示者

// DON'T
@Provides
Presenter<FwView> provideHomePresenter(NetworkService networkService) { /**/ }

@Provides
Presenter<FwView> provideSearchPresenter(NetworkService networkService) { /**/ }

将不工作。您不能提供2个相同类型的对象。它们是无法区分的。看看@Qualifiers@Named如果你确信这是你想要的路要走。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

演示者(mvP)是否应该注入(dagger2)到Android中的视图?

来自分类Dev

使用dagger2创建模型时如何将模型注入演示者?

来自分类Dev

我不知道为什么在演示者中dagger2注入的对象为null

来自分类Dev

Dagger 2 Scopes,在哪里放置演示者?

来自分类Dev

Dagger 2的依赖注入

来自分类Dev

尝试使用Dagger 2实现MVP-如何在提供的演示者中获取对Activity的引用

来自分类Dev

尝试使用Dagger 2实现MVP-如何在提供的演示者中获取对Activity的引用

来自分类Dev

如何使用 Dagger2 和 MVP 模式调用模型文件中的演示者方法

来自分类Dev

构造函数注入Dagger 2

来自分类Dev

Android Dagger 2:注入与提供

来自分类Dev

Dagger 2注入依赖链

来自分类Dev

构造函数注入Dagger 2

来自分类Dev

Dagger - lateinit 属性演示者尚未初始化 android

来自分类Dev

sublclass 的 Dagger 注入

来自分类Dev

依赖组件的 Dagger 注入

来自分类Dev

未注入 Dagger 的字段

来自分类Dev

Android Dagger 2 POJO字段注入null

来自分类Dev

如何使用Dagger 2注入Servlet?

来自分类Dev

使用Dagger 2查看依赖项注入

来自分类Dev

使用Dagger 2进行方法注入

来自分类Dev

Dagger 2依赖关系是否可以注入?

来自分类Dev

无法使用Dagger 2注入课程

来自分类Dev

AppCompatActivity中的Dagger 2注入错误

来自分类Dev

Dagger 2子组件注入错误

来自分类Dev

Dagger 2,底部导航和注入

来自分类Dev

Dagger2没有注入领域

来自分类Dev

Dagger2 和嵌套子注入

来自分类Dev

Android Dagger2 依赖注入

来自分类Dev

Android Kotlin dagger 2 ViewModel 注入错误