-
系列文章
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(),
),
)
网友评论