0

2 つの異なるフラグメントがあり、両方とも 2 つの異なるアクティビティで使用されます。どちらのアクティビティのレイアウトにも、フラグメント コンテナーとして使用するフレーム レイアウトが 1 つあります。

どれが;

フラグメント: MapFragment、ListFragment

アクティビティ: HomeActivity、SearchActivity。

HomeActivity について話しましょう。

HomeActivity は、アクティビティの onCreate に ListFragment と MapFragment を挿入し、挿入されたフラグメントをそのレイアウトにプッシュします (最初にフラグメントをリストします)。その後、アクティビティは、挿入されたフラグメントのプレゼンター メソッドを呼び出して、サービスの結果をリストまたはマップに表示します。

コード; フラグメント側;

@CustomScope
@Component(dependencies = NetComponent.class, modules = {ChallengeListFrgModule.class, ChallengeRepositoryModule.class})
public interface ChallengeListFrgComponent{

    void inject(ChallengeListFragment fragment);
}

_

 @Module class ChallengeListFrgModule(private val mView: ChallengeListFrgContract.View) {

  @Provides internal fun providesChallengeListFrgContractView(): ChallengeListFrgContract.View {
    return mView
  }
}

ListFrgPresenter:

public class ChallengeListFrgPresenter implements ChallengeListFrgContract.Presenter {

  //region  Variables

  ChallengeListFrgContract.View mView;
  ChallengeRepository challengeRepository;
  // Application application;

  private ChallengeSearchCriteria challengeSearchCriteria;

  //endregion

  //region Constructer

  @Inject public ChallengeListFrgPresenter(ChallengeRepository challengeRepository,
      ChallengeListFrgContract.View mView) {
    this.mView = mView;
    this.challengeRepository = challengeRepository;
  }

  //endregion

  //region Override Methods

  @Override public void load() {

  }

  @Override public void clearChallenges() {
    mView.clearChallenges();
  }

  }

チャレンジリストフラグメント:

@Singleton
class ChallengeListFragment/*@Inject*/
  : BaseFragment(), ChallengeListFrgContract.View {


  @Inject
  lateinit var challengeListFrgPresenter: ChallengeListFrgPresenter

///...
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    initComponent()


  }


  fun initComponent() {

    DaggerChallengeListFrgComponent.builder()
        .netComponent((activity.applicationContext as DuupleApplication).netComponent) // crash
        .challengeListFrgModule(ChallengeListFrgModule(this as ChallengeListFrgContract.View))
        .challengeRepositoryModule(ChallengeRepositoryModule(activity))
        .build()
        .inject(this)
  }
}

活動面:

HomeActivity コンポーネント:

@CustomScope @Component(dependencies = NetComponent.class, modules = {
    HomeActivityModule.class, HomeFragmentManagerModule.class, ChallengeListFrgModule.class,
    HomeNearbyMapFrgModule.class
}) public interface HomeActivityComponent {
  Context context();

  void inject(HomeActivity activity);
}

HomeActivityModule;

@Module public class HomeActivityModule {

  private final HomeActivityContract.View mView;
  private final Context context;

  public HomeActivityModule(HomeActivityContract.View mView, Context context) {
    this.mView = mView;
    this.context = context;
  }

  @Provides @CustomScope Context provideContext() {
    return context;
  }

  @Provides @CustomScope HomeActivityContract.View providesActivityContractView() {
    return mView;
  }


  @Provides @CustomScope ChallengeListFragment providesChallengeListFragment() {
    return new ChallengeListFragment();
  }

  @Provides @CustomScope HomeNearbyMapFragment providesHomeNearbyMapFragment() {
    return new HomeNearbyMapFragment();
  }
}

ホームアクティビティ:

public class HomeActivity extends DrawerActivity
    implements NavigationView.OnNavigationItemSelectedListener, HomeActivityContract.View {

  //region widgets
  Toolbar appToolbar;
  ImageView imageViewHamburger;

  private DrawerLayout drawerLayout;

  //endregion

  //region variables

  @Inject ChallengeListFragment challengeListFragment;
  @Inject HomeNearbyMapFragment homeNearbyMapFragment;

  @Inject ChallengeListFrgPresenter challengeListFrgPresenter;
  @Inject HomeNearbyMapFrgPresenter homeNearbyMapFragmentPresenter;

//...

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    initComponent();
///...
    pushFragment(challengeListFragment, FragmentHelper.homeListFragmnetIndex);
  }

protected void initComponent() {
    DaggerHomeActivityComponent.builder()
        .netComponent(((DuupleApplication) getApplicationContext()).getNetComponent())
        .homeActivityModule(new HomeActivityModule(this, this))
        .challengeListFrgModule(
            new ChallengeListFrgModule((ChallengeListFrgContract.View) challengeListFragment))
        .homeFragmentManagerModule(
            new HomeFragmentManagerModule(HomeActivity.this, manager, R.id.placeHolder_HomeAct))
        .homeNearbyMapFrgModule(
            new HomeNearbyMapFrgModule((HomeNearbyMapFrgContract.View) homeNearbyMapFragment))
        .build()
        .inject(this);

  }
}

更新: 問題は次のとおりです。initComponent メソッドの HomeActivity に challengeListFragment を注入する必要があります。また、同じ場所でパラメータとして ChallengeListFrgModule に challengeListFragment オブジェクトを渡す必要があります。ここで問題が発生したと思います。ChallengeListFragment オブジェクトの注入が完了する前に、ChallengeListFrgModule コンストラクターがトリガーされました。どうすれば修正できますか

4

0 に答える 0