Dagger2 在片段演示器中获取 activity 演示器的实例

Dagger2 getting instance of activity presenter in fragment presenter

我真的很迷茫,希望你能帮助我。我正在使用 MVP 和 dagger2 编写应用程序。其中一项活动(假设 A )包含 FragmentStatePagerAdapter 中的片段( B )。 activity 和片段都有自己的演示者。我正在处理片段中的输入( B ),并将数据从 "up" 传输到主演示者( B -> A ) (activity 持有片段)和那里(A)我正在处理网络连接。

为此,我需要片段演示器(B)中的主要演示器(A)实例。我尝试使用对片段图的依赖,但不是获取已经存在的演示者实例,而是在每个 init 中创建新的演示者实例。有人建议我如何使用 ActivityScope 获得类似于单身人士的东西吗?

一张图:

@ActivityScope
@Component(modules = GiftListModule.class, dependencies = AppGraph.class)
public interface GiftListGraph extends AppGraph{
    void inject(GiftListActivity giftListActivity);

    GiftListPresenter getGiftListPresenter();

    final class Initializer {
        public static GiftListGraph init(AppGraph appGraph, GiftListView giftListView) {
            return DaggerGiftListGraph.builder()
                                   .giftListModule(new GiftListModule(giftListView))
                                   .appGraph(appGraph)
                                   .build();
        }
    }
}

一个模块:

@Module
public class GiftListModule {
    private final GiftListView giftListView;

    public GiftListModule(GiftListView giftListView) {
        this.giftListView = giftListView;
    }

    @Provides GiftListView provideGiftListView() {
        return giftListView;
    }

    @Provides GiftListPresenter provideGiftListPresenter(GiftListView giftListView) {
        return new GiftListPresenterImpl(giftListView);
    }
}

B图:

@FragmentScope
@Component(modules = GiftDetailsModule.class, dependencies = GiftListGraph.class)
public interface GiftDetailsGraph {
    void inject(GiftDetailsFragment giftDetailsFragment);

    GiftDetailsPresenter getGiftDetailsPresenter();

    final class Initializer {
        public static GiftDetailsGraph init(GiftListGraph giftListGraph, GiftDetailsView giftDetailsView) {
            return DaggerGiftDetailsGraph.builder()
                                      .giftDetailsModule(new GiftDetailsModule(giftDetailsView))
                                      .giftListGraph(giftListGraph)
                                      .build();
        }
    }
}

B模块:

@Module
public class GiftDetailsModule {
    private final GiftDetailsView giftDetailsView;

    public GiftDetailsModule(GiftDetailsView giftDetailsView) {
        this.giftDetailsView = giftDetailsView;
    }

    @Provides GiftDetailsView provideGiftDetailsView() {
        return giftDetailsView;
    }

    @Provides GiftDetailsPresenter provideGiftDetailsPresenter(GiftDetailsView giftDetailsView,
            GiftListPresenter giftListPresenter) {
        return new GiftDetailsPresenterImpl(giftDetailsView, giftListPresenter);
    }
}

主应用程序:

public class MainApp extends Application {
    private static MainApp sInstance;
    protected AppGraph appGraph;
    protected GiftListGraph giftListGraph;

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        appGraph = AppGraph.Initializer.init(this);
    }

    public static MainApp getInstance() {
        return sInstance;
    }

...

    public GiftListGraph getGiftListGraph(GiftListView view) {
        return giftListGraph = GiftListGraph.Initializer.init(appGraph, view);
    }

    public GiftDetailsGraph getGiftDetailsGraph(GiftDetailsView view) {
        return GiftDetailsGraph.Initializer.init(giftListGraph, view);
    }

... }

感谢您能给我的任何帮助:)

从 DI 的角度来看,您看到的是正确的行为。当您调用获取列表图或详细图时,您正在构建全新的图。 (请参阅初始化程序调用中的新模块调用)。因此,您每次都会获得新实例。

我会考虑的选项很少。

  1. 一个: 在 activity 范围内定义回调接口。让 activity 实施它。在创建片段图的过程中,将回调 impl 实例(activity 或某些 impl class)作为参数传递。您的片段 a/b 演示者可以将其用作依赖项。现在两个片段演示者都会收到回电。

  2. 两个: 在应用范围或 activity 范围内使用 运行 的事件总线或广播接收器。用它来回 post 消息。

希望这能给你一些想法。