简体   繁体   English

flutter 重用片段浮动在其他视图之上

[英]flutter reuse fragment float above other views

I have two reuse fragments, and the second on is a flutter fragment, which behave strange.我有两个重用片段,第二个是 flutter 片段,它的行为很奇怪。

above Android API 29, flutter fragment will render above first fragment after the detail activity pop out of stack.以上 Android API 29,flutter 片段将在细节活动弹出堆栈后呈现上面的第一个片段。

under Android API 29, flutter fragment always render above all views in the main activity.在 Android API 29 下,flutter 片段始终在主要活动中呈现所有视图。

I create this repository to reproduce this error.我创建此存储库以重现此错误。

This unsolved question is similar to mine.这个未解决的问题与我的类似。

this code shows how I reuse fragments这段代码展示了我如何重用片段

    private void switchTo(String tag) {

        FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
        if (tag.equals("home")) {
            fragmentTransaction.show(homeFragment);
            fragmentTransaction.hide(notificationsFragment);
        } else {
            fragmentTransaction.show(notificationsFragment);
            fragmentTransaction.hide(homeFragment);
        }
        fragmentTransaction.commitNowAllowingStateLoss();
    }

this is where flutter fragment add to the view这是 flutter 片段添加到视图的位置

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        FragmentManager fragmentManager = getChildFragmentManager();
        if (mRepGoalsFlutterFragment1 == null) {
            mRepGoalsFlutterFragment1 = FlutterFragment.withNewEngine()
                    .build();
            fragmentManager
                    .beginTransaction()
                    .add(R.id.card_view7,
                            mRepGoalsFlutterFragment1,
                            TAG_REP_GOALS_FLUTTER_FRAGMENT_1)
                    .commit();
        }

        return inflater.inflate(R.layout.fragment_notifications, container, false);
    }

In my Fragment, I have to detachFlutterEngine myself to fix this problem.在我的 Fragment 中,我必须自己分离 FlutterEngine 来解决这个问题。

private FlutterView myFlutterView;
private boolean isFlutterHidden = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    myFlutterView = FlutterBoostUtils.findFlutterView(view);
    return view;
}

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    isFlutterHidden = hidden;
    updateFlutterViewHidden();
}

@SuppressLint("VisibleForTests")
void updateFlutterViewHidden() {
    if (myFlutterView == null) return;
    if (isFlutterHidden) {
        myFlutterView.setVisibility(View.GONE);
    } else {
        myFlutterView.setVisibility(View.VISIBLE);
    }
}

@Override
public void onResume() {
    super.onResume();
    updateFlutterViewHidden();
}

Combine your posts with Github issue( https://github.com/flutter/flutter/issues/59968 ),the solution is create self class extends FlutterFragment, get flutterSurfaceView in the onFlutterSurfaceViewCreated . Combine your posts with Github issue( https://github.com/flutter/flutter/issues/59968 ),the solution is create self class extends FlutterFragment, get flutterSurfaceView in the onFlutterSurfaceViewCreated .

    private FlutterSurfaceView flutterView;
    @Override
    public void onFlutterSurfaceViewCreated(@NonNull FlutterSurfaceView flutterSurfaceView) {
        super.onFlutterSurfaceViewCreated(flutterSurfaceView);
        LogUtils.d(TAG, "onFlutterSurfaceViewCreated开始");
        this.flutterView = flutterSurfaceView;
        LogUtils.d(TAG, "onFlutterSurfaceViewCreated结束");
    }

Then setVisibility in onResume.然后在 onResume 中设置可见性。

@SuppressLint("解决FlutterFragment切换到前台显示的问题")
void updateFlutterViewVisibility() {
    if (flutterView == null) {
        return;
    }
    if (isFlutterHidden) {
        flutterView.setVisibility(View.GONE);
    } else {
        flutterView.setVisibility(View.VISIBLE);
    }
}

@Override
public void onResume() {
    LogUtils.d(TAG, "onResume开始");
    super.onResume();
    updateFlutterViewVisibility();
    LogUtils.d(TAG, "onResume结束");
}

@Override
public void onHiddenChanged(boolean hidden) {
    LogUtils.d(TAG, "onHiddenChanged开始");
    super.onHiddenChanged(hidden);
    isFlutterHidden = hidden;
    updateFlutterViewVisibility();
    LogUtils.d(TAG, "onHiddenChanged结束");
}

Create your self class extends FlutterFragment like this:创建你自己的 class 像这样扩展 FlutterFragment:

FlutterFragment.CachedEngineFragmentBuilder(
        YourFlutterFragment::class.java,
        YourFlutterFragmentEngineId
    )
        .shouldAttachEngineToActivity(false)
        .build<YourFlutterFragment>()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM