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 的角度来看,您看到的是正确的行为。当您调用获取列表图或详细图时,您正在构建全新的图。 (请参阅初始化程序调用中的新模块调用)。因此,您每次都会获得新实例。
我会考虑的选项很少。
一个:
在 activity 范围内定义回调接口。让 activity 实施它。在创建片段图的过程中,将回调 impl 实例(activity 或某些 impl class)作为参数传递。您的片段 a/b 演示者可以将其用作依赖项。现在两个片段演示者都会收到回电。
两个:
在应用范围或 activity 范围内使用 运行 的事件总线或广播接收器。用它来回 post 消息。
希望这能给你一些想法。
我真的很迷茫,希望你能帮助我。我正在使用 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 的角度来看,您看到的是正确的行为。当您调用获取列表图或详细图时,您正在构建全新的图。 (请参阅初始化程序调用中的新模块调用)。因此,您每次都会获得新实例。
我会考虑的选项很少。
一个: 在 activity 范围内定义回调接口。让 activity 实施它。在创建片段图的过程中,将回调 impl 实例(activity 或某些 impl class)作为参数传递。您的片段 a/b 演示者可以将其用作依赖项。现在两个片段演示者都会收到回电。
两个: 在应用范围或 activity 范围内使用 运行 的事件总线或广播接收器。用它来回 post 消息。
希望这能给你一些想法。