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

wwtsj6pe  于 2023-04-30  发布在  Android
关注(0)|答案(1)|浏览(228)

我需要将在原生代码iOS/Android中创建的SDK Package 到Flutter中。Android端有一些功能,我的Fragment或Activity需要扩展SDKFragment或Activity来实现自定义视图。我的问题是如何将SDKFragment或Activity封装在Flutter plugin中,并让flutter项目端使用我的插件扩展?我换句话说,我想有一个小部件,可以扩展片段或活动使用我的插件有能力显示小部件UI在SDK
在插件中使用FlutterFragment,FlutterActivity是正确的方法吗?
我的意思是:Flutter项目(Widget)<->Flutter插件(FlutterFragment或FlutterActivity附加到原生SDK Fragment或Activity)
如果不是,什么是可能的解决方案?

vd2z7a6w

vd2z7a6w1#

我也遇到了同样的问题,以下是我的解决方案:

  • 实现一个支持ActivityAware的FlutterPlugin,参考FlutterPlugin with ActivityAware如何缓存Activity,以及MethodCallHandler(与FlutterWidget应用程序通信)。
  • 实现方法调用e.例如***SHOW_NATIVE_FRAGMENT***,其中将附加本机片段。注意:需要动态添加View作为片段的容器
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);
  • 然后将片段附加到Activity
FragmentManager fm = ((FragmentActivity) activity).getSupportFragmentManager();
        fm.beginTransaction()
            .replace(id, nativeFragment)
            .commitAllowingStateLoss();
  • 当你完成了Fragment,记住用success()error()调用MethodChannel.Result,否则FlutterWidget将永远被阻止。
  • 在FlutterWidget端,使用
static Future<void> showNativeFragment() async {
            await _channel.invokeMethod("SHOW_NATIVE_FRAGMENT");
        }

还要确保FlutterWidget的应用程序Activity扩展了FlutterFragmentActivity

相关问题