Mosby 3 MVP - 返回到返回堆栈中的片段时总是重新创建演示者

Mosby 3 MVP - presenter is always recreated when go back to the fragment in the back stack

当我们对返回堆栈中的前一个片段执行 popBackStack 和 return 时,方法 onViewCreated(View view, Bundle bundle) 中的包始终为空,因为 onSaveInstanceState(Bundle outState) 之前没有被调用。因此,当我们返回时,bundle 为 null 并且再次创建了 presenter(和 view state)。在这种情况下,我们如何重用演示者和视图状态(而不是重新创建它)?

您可以在下面看到一个虚拟示例。有一个带有 2 个按钮的片段。一个按钮打开一个新片段,另一个按钮转到前一个片段。当您返回时,将重新创建演示者和视图状态。那不是我需要的,但我在上面根据库中的代码描述了它发生的原因。 有没有办法确保我们在返回时重用 Presenter 和 View 状态?

public class FirstFragment extends MvpViewStateFragment<FirstFragmentView, FirstFragmentPresenter, FirstFragmentViewState> {

public static final String TAG = "TAG";

private Button moveToAnotherFragmentButton;
private Button moveBackButton;

@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
    final View rootFragmentView = inflater.inflate(R.layout.first_fragment, container, false);
    moveToAnotherFragmentButton = (Button) rootFragmentView.findViewById(R.id.first_fragment_go_to_another_fragment_button);
    moveBackButton = (Button) rootFragmentView.findViewById(R.id.first_fragment_back_button);
    return rootFragmentView;
}

@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    moveToAnotherFragmentButton.setOnClickListener(ignored -> addToStack(FirstFragment.class));
    moveBackButton.setOnClickListener(ignored -> getFragmentManager().popBackStack());
}

@Override
@NonNull
public FirstFragmentPresenter createPresenter() {
    Log.e(TAG, "createPresenter");
    return new FirstFragmentPresenter();
}

@NonNull
@Override
public FirstFragmentViewState createViewState() {
    Log.e(TAG, "createViewState");
    return new FirstFragmentViewState();
}

@Override
public void onNewViewStateInstance() {
    Log.e(TAG, "onNewViewStateInstance");
}

private void addToStack(@NonNull final Class<? extends Fragment> fragmentClass) {
    final FragmentManager fragmentManager = getFragmentManager();
    if (fragmentManager.isDestroyed()) {
        throw new UnexpectedException("FragmentManager is destroyed");
    }

    final Fragment fragment = Fragment.instantiate(getContext(), fragmentClass.getName());

    final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    fragmentTransaction.replace(R.id.activity_main_content_container, fragment, null)
            .addToBackStack(null)
            .commit();
}
}

这个库的创建者回答了这个问题here。简短的回答:"this behavior was not intended".