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)
如果不是,可能的解决方案是什么?
我面临着同样的问题,这是我的解决方案:
实现一个支持的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)
MethodChannel.Result任一方式调用,success()否则error()FlutterWidget 将永远被阻塞。 static Future<void> showNativeFragment() async {
await _channel.invokeMethod("SHOW_NATIVE_FRAGMENT");
}
Run Code Online (Sandbox Code Playgroud)
并且还要确保您的 FlutterWidget 的应用程序 Activity extends FlutterFragmentActivity。