在其模块内引用活动

4

如何在 Activity Module 中使用新的 AndroidInjector.inject 并仍然能够提供一个 Activity 实例?Dagger文档没有明确说明如何实现。

具体情况如下:我有一个 Activity Module,它为我的 Activity 提供了一个 Presenter,但是这个 Presenter 需要引用 Activity 实例。以前我可能会这样写:

@Inject Presenter presenter;

public onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ((CustomApplication) getApplicationContext())
       .getAppComponent()
       .plus(new ActivityModule(this));
}

请问有没有示例使用 AndroidInjector.inject(this) 并允许在 Dagger 2 模块中引用 Activity 的参考?


我对Dagger不熟悉,但或许WeakReference可以帮助您引用Activity。 - Mehran Zamani
这不是 WearReference 的问题。问题在于根本无法获取引用。创建模块的实例是 Dagger 库,因此我需要在模块内部访问它所属的 Activity。 - BugsBunnyBR
我也在努力中想在我的@Module中获取活动参考,但Dagger1/2集成起来非常困难,因为我需要用一个DI替换我的Roboguide。 - vijay
1个回答

4

请查看 Dagger 2 Github issue 615

你的Activity实例会自动提供,只需在模块方法中将其作为参数传递即可。

示例:

@Provides
@ActivityScope
public providePresenter(ActivityA activity) {
    return new PresenterA(activity);
}

现在您可以抽象简单的模块。您的主持人也可以通过构造函数注入。

这实际上减少了我所有模块中的大量代码。


1
@oldergod 看来我的设置完全错了,但却完全正常工作。现在我未来有很多折射问题要解决。我基于这个误解建立了很多东西,认为它能够构建和运行就意味着是正确的。 - Jon Merritt
@oldergod 希望能得到一点确认。我在这里看到了你的问题https://dev59.com/FKDia4cB1Zd3GeqPDW3q#43103956,并且认为我们两个都被同样的问题绊住了。具体来说是最近的dagger android示例的结构?我相当确定我之前已经接近正确了,而你提到的错误并不意味着我的设置是不正确的?并不是我自负,只是我已经试图通过一个漩涡几天了,试图弄清楚它 lol。 - Jon Merritt
1
@JonMerritt 我认为 @ActivityScope @Binds abstract BaseActivity activity(MyActivity activity); 很有帮助。只是它不应该放在与父组件链接的模块中,而是应该放在添加到子组件中的模块中。 - oldergod
@oldergod 这是非常好的消息。我认为我们遇到了同样的问题,只是在不同的时间点被绊倒了。这完全不是你的错,但你的评论让我有些困惑。甚至让我开始怀疑我的现实。为了确保万无一失,如果我在GitHub上发布一个骨架应用程序并发布链接,你能否帮忙审查一下,提供新的视角? - Jon Merritt
@JonMerritt 我很乐意。实际上我也做了一个:https://github.com/oldergod/dagger-android-sample/tree/master/app/src/main/java/dagger/demo - oldergod
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接