如何在 Flutter 插件中使用 Android Fragment?

uni*_*ead 6 android android-fragments dart flutter

我需要将在 iOS/Android 原生代码中创建的 SDK 包装到 Flutter 中。在 Android 端,我的 Fragment 或 Activity 需要扩展SDK Fragment 或 Activity 来实现自定义视图。我的问题是如何将SDK Fragment 或 Activity 包装在Flutter 插件中,并使用我的插件在 flutter 项目端扩展它?换句话说,我想要一个可以使用我的插件扩展 Fragment 或 Activity 的 Widget,以便能够在 SDK 中显示 Widget ui

在插件中使用 FlutterFragment、FlutterActivity 是正确的方法吗?

我的意思是:Flutter 项目(Widget)<-> Flutter 插件(附加到原生 SDK Fragment 或 Activity 的 FlutterFragment 或 FlutterActivity)

如果不是,可能的解决方案是什么?

pdd*_*inh 4

我面临着同样的问题,这是我的解决方案:

  • 实现一个支持的FlutterPlugin ActivityAware,参考这个带有ActivityAware的FlutterPlugin如何缓存Activity,以及MethodCallHandler(与FlutterWidget应用程序通信)。

  • 实现一个 MethodCall,例如SHOW_NATIVE_FRAGMENT,它将在其中附加本机片段。注意:需要动态添加一个View作为fragment的容器

         int id = 0x123456;
         ViewGroup.LayoutParams vParams = new FrameLayout.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
         );
         FrameLayout container = new FrameLayout(context);
         container.setLayoutParams(vParams);
         container.setId(id);
         activity.addContentView(container, vParams);
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后将Fragment附加到Activity上

        FragmentManager fm = ((FragmentActivity) activity).getSupportFragmentManager();
        fm.beginTransaction()
            .replace(id, nativeFragment)
            .commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)
  • 当您使用完 Fragment 后,请记住使用MethodChannel.Result任一方式调用,success()否则error()FlutterWidget 将永远被阻塞。
  • 在 FlutterWidget 端,使用以下命令调用 MethodChannel
        static Future<void> showNativeFragment() async {
            await _channel.invokeMethod("SHOW_NATIVE_FRAGMENT");
        }
Run Code Online (Sandbox Code Playgroud)

并且还要确保您的 FlutterWidget 的应用程序 Activity extends FlutterFragmentActivity