flutter 插件

2023-11-18

一:简介 

Flutter 中调用这些能力就必须和原生平台进行通信。目前Flutter 已经支持 iOS、Android、Web、macOS、Windows、Linux等众多平台,要调用特定平台 API 就需要写插件。插件是一种特殊的包,和纯 dart 包主要区别是插件中除了dart代码,还包括特定平台的代码,比如 image_picker 插件可以在 iOS 和 Android 设备上访问相册和摄像头。
 

Flutter 中我们想根据宿主平台添加一些差异化的功能,因此 Flutter 中提供了一个全局变量 defaultTargetPlatform 来获取当前应用的平台信息,defaultTargetPlatform定义在"platform.dart"中,它的类型是TargetPlatform,这是一个枚举类

enum TargetPlatform {
  android,
  fuchsia,
  iOS,
  ...
}

二: 具体实现:

Flutter端实现
1).Flutter 需要创建 MethodChannel
2).调用方法。

创建通道, flutter/test 通道名称,各端需要一直。
MethodChannel _methodChannel = MethodChannel("flutter/test");

// 方法调用,(方法名称,传递参数)
String versionName = _methodChannel.invokeMethod<bool>("getVersionName", "获取版本");

Native 端实现,已android 为例
1):android 端创建通道。
2):实现方法,数据返回。

var mMethodChannel: MethodChannel? = null

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngine.plugins.add(FlutterUmengPlugin())  // 添加插件
 mMethodChannel = MethodChannel(messenger, "flutter/test")
        mMethodChannel?.setMethodCallHandler { call, result ->
            Log.d("tag", "mMethodChannel.call.method" + call.method)
            when (call.method) {
                "getVersionName" -> {
                    result.success(gePlatform())
                }
               
                else -> {
                    result.error("UNAVAILABLE", "not find", null)
                }
            }
        }
    }


private fun gePlatform(): String {
    return "1.1";
}

三:插件实现
优点:功能隔离,便于维护。
Flutter 端实现

class FlutterPlugin {
  static const MethodChannel _channel = MethodChannel('flutter/flutter_plugin');

  static Future<String> testText({required String testString}) async {
    Map<String, dynamic> testMap = {
      "test": shareString,
    };
final String result = await _channel.invokeMethod('testText', shareMap);
    Print.print("testText result--> " + result);
    return result;
}

Native 端实现 android 为例

public class FlutterPlugin implements MethodCallHandler, EventChannel.StreamHandler, FlutterPlugin {
    private Context applicationContext;
    private MethodChannel methodChannel;

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
      if (call.method.equals("test")) {
            String test = call.argument("test");
            Log.d(TAG, "test value " + test);
            result.success("share success");
        } else {
            result.notImplemented();
        }
    }

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
        Log.d(TAG, "onAttachedToEngine");
        onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger());
    }

    private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) {
        this.applicationContext = applicationContext;
        methodChannel = new MethodChannel(messenger, "flutter/flutter_plugin");
        methodChannel.setMethodCallHandler(this);
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        applicationContext = null;
        methodChannel.setMethodCallHandler(null);
        methodChannel = null;
    }

// FlutterTestActivity
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngine.plugins.add(FlutterUmengPlugin())  // 添加插件
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter 插件 的相关文章

随机推荐