"OpenAndroidmo" />

flutter调用android原生组件

您所在的位置:网站首页 flutter原生组件 flutter调用android原生组件

flutter调用android原生组件

2023-12-19 06:17| 来源: 网络整理| 查看: 265

写一个小例子,比如在flutter的界面中显示android原生的TextView组件,

效果图:

步骤如下:

1、通过Android studio打开flutter工程,选中工程名,单击鼠标右键,"Flutter"->"Open Android module in Android Studio",打开Android模块。

2、创建一个Class实现PlatformView接口,比如新建CustomView类,实现PlatformView接口,在CustomView的构造方法中实例化TextView,构造方法也可以接收外部传来的参数,如TextView要显示的文本text。在getView()方法中返回TextView实例.

package com.example.eiss_app.plugin; import android.content.Context; import android.view.View; import android.widget.TextView; import io.flutter.plugin.platform.PlatformView; public class CustomView implements PlatformView { private TextView textView; public CustomView(Context context,String text) { textView = new TextView(context); textView.setText(text); } @Override public View getView() { return textView; } @Override public void dispose() { } }

3、创建一个Class继承自PlatformViewFactory,重写create方法,在create方法中实例化刚刚的View类CustomView,然后返回。create方法的第三个参数表示flutter传递给android的参数。

package com.example.eiss_app.plugin; import android.content.Context; import java.util.Map; import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.platform.PlatformView; import io.flutter.plugin.platform.PlatformViewFactory; public class CustomViewFactory extends PlatformViewFactory { public CustomViewFactory(MessageCodec messageCodec) { super(messageCodec); } @Override public PlatformView create(Context context, int i, Object o) { Map param = (Map)o; String text = (String)param.get("text"); return new CustomView(context,text); } }

4、创建一个class用来注册view,这个class提供一个方法,用来注册,方法名随便写,需要一个参数PluginRegistry,具体如下:

     注意 registrar.platformViewRegistry().registerViewFactory("widget.name", new CustomViewFactory(new StandardMessageCodec()))中的widget.name,这个会在flutter中用到。

package com.example.eiss_app.plugin; import android.util.Log; import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.StandardMessageCodec; public class CustomViewRegistrant { private static final String TAG = CustomViewRegistrant.class.getName(); public static void registerWith(PluginRegistry registry) { final String key = TextureWidgetRegistrant.class.getCanonicalName(); Log.i(TAG,"registerKey="+key); if (registry.hasPlugin(key)) { return; } PluginRegistry.Registrar registrar = registry.registrarFor(key); registrar.platformViewRegistry().registerViewFactory("widget.name", new CustomViewFactory(new StandardMessageCodec())); } }

5、在MainActivity中调用注册类。

      注意:不用手动修改GeneratedPluginRegistrant类,自己写的插件不要放到GeneratedPluginRegistrant中注册,而是应该自己写注册类,然后在MainActivity中调用注册类

package com.example.eiss_app; import android.os.Bundle; import android.util.Log; import com.example.eiss_app.plugin.hkvideo.CustomViewRegistrant; import com.example.eiss_app.plugin.hkvideo.HKPlayer; import com.example.eiss_app.plugin.hkvideo.HKVideoPlayerFlutterPlugin; import com.example.eiss_app.plugin.hkvideo.TextureWidgetRegistrant; import com.hikvision.open.hikvideoplayer.HikVideoPlayerFactory; import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { private static final String TAG = MainActivity.class.getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); CustomViewRegistrant.registerWith(this); } }

6、在flutter中使用,使用AndroidView,viewType为刚刚定义的"widget.name".

import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class My extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: AndroidView( viewType: 'widget.name', creationParams: {'text': 'Flutter传给Android的参数'}, creationParamsCodec: StandardMessageCodec(), ), ); } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3