flutter plugin之路(阶段完结):四步实现flutt

2023-03-17  本文已影响0人  帅气的阿斌

flutter与原生交互传值OC/java版(一)
flutter与原生交互传值OC/java版(二)
四步实现flutter显示iOS原生组件OC/java版(三)
四步实现flutter显示安卓原生组件OC/java版(三)
本demo的github地址:https://github.com/iBinbro/flutterstudy

四步实现flutter显示安卓原生组件

一、安卓端的实现

1.新建原生组件(我是iOS开发...)

/// 原生的组件
class NVView extends TextView {
    public NVView(Context context, Object arg) {
        super(context);
        setText("我是安卓原生组件" + arg);
    }
}

2.新建一个继承PlatformView类 返回具体的原生组件

/// 一个继承PlatformView类 返回具体的原生组件
class NVPlatformView implements PlatformView {
    Context context;
    Object args;

    NVPlatformView(Context context, Object args) {
        this.context = context;
        this.args = args;
    }

    /// 这里返回原生组件
    @Nullable
    @Override
    public View getView() {
        Log.d("args", "args = " + args);
        return new NVView(context, args);
    }

    @Override
    public void dispose() {
        Log.d("销毁", "NVPlatformView 销毁 自动释放的");
    }
}

3.新建一个工厂类 返回 PlatformView 类实例

/// 新建一个工厂类 返回 PlatformView 类实例
class NVPlatformViewFactory extends PlatformViewFactory {

    /// 与flutter中 creationParams creationParamsCodec 对应 不实现此方法args则为null
    public NVPlatformViewFactory() {
        super(StandardMessageCodec.INSTANCE);
    }

    @NonNull
    @Override
    public PlatformView create(Context context, int viewId, @Nullable Object args) {
        //args 根据这个参数可以返回不同的view
        return new NVPlatformView(context, args);
    }
}

4.原生代码里注册插件以及注册步骤3中创建的NVPlatformViewFactory
这里比iOS多一步,需要再创建一个实现FlutterPlugin的类,然后再注册NVPlatformViewFactory

/**********flutter显示原生组件flutter**********/
public class NVPlugin implements FlutterPlugin {

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
        binding.getPlatformViewRegistry().registerViewFactory("nvview", new NVPlatformViewFactory());
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {

    }
}
public class MainActivity extends FlutterActivity {

    //其他代码...

    //注册插件 核心代码
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        //添加插件
        flutterEngine.getPlugins().add(new NVPlugin());
    }

    //其他代码...
}

flutter侧的代码

      Container(
        width: 100,
        height: 100,
        color: Colors.red,
        child: AndroidView(
          viewType: "nvview",
          creationParams: 2,
          creationParamsCodec: StandardMessageCodec(),
        ),
      )
上一篇下一篇

猜你喜欢

热点阅读