gpt4 book ai didi

android - 如何正确地为单个 Activity App 注入(inject) fragment

转载 作者:行者123 更新时间:2023-11-29 01:06:01 25 4
gpt4 key购买 nike

我在我的项目中使用了 dagger2。项目遵循 MVP 模式。我的应用程序设计就像我在使用单个 Activity 通过我的申请。所有 UI 元素都在 Fragments 中,单个 Activity 充当项目中所有 fragment 的宿主 Activity 。我项目中的每个模块都将使用fragment 作为 UI 组件,如 LoginFragment、SplashScreenFragment、RegistrationFragment、HomeScreenFragment。

所以基本上我的 Activity 只会启动一次,它只包含一个 fragment 容器, fragment 将被替换当用户导航到每个模块中的每个屏幕时。

每次用户从一个屏幕移动到另一个屏幕时,它不会创建一个 Activity ,它只会调用一个 gotoNextScreen在 Activity 中,然后将膨胀下一个 fragment

所以我的 Activity 将只做以下操作

  • 接收要启动的下一个屏幕类型
  • 从启动屏幕类型中找到要膨胀的 fragment 从 Intent
  • 创建fragment(在MVP中充当 View 层)和presenter对于屏幕
  • 链接演示者和 fragment (或 View )
  • 执行 fragment 交易。

因为我有 n 个屏幕(n 个 fragment 和演示者),我不能使用字段注入(inject)像

这样的 Activity
            public class MainActivity{
@Inject RegistrationFragment registrationFragment;
@Inject LoginFragment loginFragment
}

因为field的数量会很大,而且一次我们只需要一个fragment和一位主持人。所以我所做的是,我为每个模块创建了单独的组件,使它成为我的主要 App 组件的依赖组件。现在我的 Activity 看起来像这样。

            public void gotoNextScreen(ScreenType screentype, Data data){

switch(screentype){
case LOGIN:
DaggerLoginComponent.builder()
.appComponent(mAppComponent)
.build();
// get login fragment and presenter from login component and inflate
break;

case REGISTRATION:
DaggerLoginComponent.builder()
.appComponent(mAppComponent)
.build();
// get registration fragment and presenter from registration component and inflate

// and the switch case goes on like this

}
}

我觉得这很难,因为我几乎要在每个模块中重复代码。我只是为不同的 fragment 类型和演示者创建不同的组件。

我可以简化使用泛型或类似的东西吗? Dagger 是否提供任何简单的方法来解决这种问题问题?谁能展示一些示例代码来解决这个问题?

最佳答案

我也不知道这是否是正确的方法,因为我对 Dagger2 和 MVP 也很陌生,但我已经这样实现了:

official documentation 中所述,Fragment 有一个对 Activity 的回调。 .

作为 gotoNextScreen 方法的回调。goToNextScreen(由 Activity 实现)调用 Activity 演示者。

该演示者负责实例化 fragment 并在 View ( Activity )上调用 displayFragment 方法。就像那样,Activity 对实现一无所知。它只是将信息传递给演示者,然后显示 fragment 。

看起来像这样:

fragment A

public void onNext(){
mActivityCallback.gotoNextScreen(screentype, data);
}

Activity

public void gotoNextScreen(ScreenType screentype, Data data){
mPresenter.goToNext(screentype, data);
}

public void displayFragment(Fragment f){
// Code to replace the current Fragment by the fragment f
}

Activity 主持人

public void goToNext(ScreenType screentype, Data data){
Fragment f;
switch(screentype){
case A:
f = FragmentA.newInstance(data);
break;
case B:
f = FragmentB.newInstance(data);
break;
...
}
mView.displayFragment(f); // mView is the Activity
}

正如我所说,我不确定这个实现是否有效,因为:

  • 您有 2 次相同的 gotoNextScreen 方法(在 Activity 和 Presenter 中)
  • Presenter 处理 Fragment(Android 对象)。
  • 未注入(inject) fragment 。

编辑

Dagger 部分:

Activity 在创建时被注入(inject):

MainActivityComponent component = ((CustomApplication) getApplication()).getComponent()
.plus(new MainActivityModule());

与 fragment 相同:

Activity 的回调有一个 getComponent 方法,当 fragment 被附加时,它调用:

public void onAttach(Context context) {
//...
activityCallback.getComponent().inject(FragmentA.this)
}

关于android - 如何正确地为单个 Activity App 注入(inject) fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com