Android Mosby 3 MVP-当返回到后堆栈中的片段时,始终会重新创建演示者

Android Mosby 3 MVP-当返回到后堆栈中的片段时,始终会重新创建演示者,android,mvp,mosby,Android,Mvp,Mosby,当我们执行popBackStack并返回到后堆栈中的前一个片段时,方法onViewCreated(View View,bundle bundle)中的bundle总是空的,因为以前没有调用过onSaveInstanceState(bundle outState)。所以,当我们返回时,bundle为null,并再次创建一个presenter(和视图状态)。在这种情况下,我们如何重用presenter和view state(而不是重新创建它) 您可以在下面看到一个虚拟示例。有一个带有2个按钮的片段。

当我们执行
popBackStack
并返回到后堆栈中的前一个片段时,方法
onViewCreated(View View,bundle bundle)
中的bundle总是空的,因为以前没有调用过
onSaveInstanceState(bundle outState)
。所以,当我们返回时,bundle为null,并再次创建一个presenter(和视图状态)。在这种情况下,我们如何重用presenter和view state(而不是重新创建它)

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

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();
}
}
public类FirstFragment扩展了mvpviewstateframent{
公共静态最终字符串TAG=“TAG”;
私有按钮移动到另一个片段按钮;
私有按钮moveback按钮;
@可空
@凌驾
创建视图上的公共视图(最终布局扁平充气机、@Nullable final ViewGroup容器、@Nullable final Bundle savedInstanceState){
最终视图rootFragmentView=充气机。充气(R.layout.first_碎片,容器,假);
moveToAnotherFragmentButton=(Button)rootFragmentView.findViewById(R.id.first\u fragment\u go\u to\u另一个\u fragment\u按钮);
moveBackButton=(按钮)rootFragmentView.findViewById(R.id.first\u fragment\u back\u按钮);
返回rootFragmentView;
}
@凌驾
已创建公用void onviewView(@NonNull final View,@null final Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
移动到另一个FragmentButton.setOnClickListener(忽略->addToStack(FirstFragment.class));
setOnClickListener(忽略->getFragmentManager().popBackStack());
}
@凌驾
@非空
public FirstFragmentPresenter createPresenter(){
Log.e(标记“createPresenter”);
返回新的FirstFragmentPresenter();
}
@非空
@凌驾
public FirstFragmentViewState createViewState(){
Log.e(标记“createViewState”);
返回新的FirstFragmentViewState();
}
@凌驾
public void onNewViewStateInstance(){
Log.e(标记“onNewViewStateInstance”);
}

private void addToStack(@NonNull final Class此库的创建者回答了这个问题。简短的回答是:“此行为不是故意的”。

放入您的代码here@LuizFernandoSalvaterra我添加了一个小示例