• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

flutter 插件

武飞扬头像
为今天而努力
帮助1

一:简介 

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

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

  1.  
    enum TargetPlatform {
  2.  
    android,
  3.  
    fuchsia,
  4.  
    iOS,
  5.  
    ...
  6.  
    }

二: 具体实现:

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

  1.  
    创建通道, flutter/test 通道名称,各端需要一直。
  2.  
    MethodChannel _methodChannel = MethodChannel("flutter/test");
  3.  
     
  4.  
    // 方法调用,(方法名称,传递参数)
  5.  
    String versionName = _methodChannel.invokeMethod<bool>("getVersionName", "获取版本");

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

  1.  
    var mMethodChannel: MethodChannel? = null
  2.  
     
  3.  
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
  4.  
    super.configureFlutterEngine(flutterEngine)
  5.  
    flutterEngine.plugins.add(FlutterUmengPlugin()) // 添加插件
  6.  
    mMethodChannel = MethodChannel(messenger, "flutter/test")
  7.  
    mMethodChannel?.setMethodCallHandler { call, result ->
  8.  
    Log.d("tag", "mMethodChannel.call.method" call.method)
  9.  
    when (call.method) {
  10.  
    "getVersionName" -> {
  11.  
    result.success(gePlatform())
  12.  
    }
  13.  
     
  14.  
    else -> {
  15.  
    result.error("UNAVAILABLE", "not find", null)
  16.  
    }
  17.  
    }
  18.  
    }
  19.  
    }
  20.  
     
  21.  
     
  22.  
    private fun gePlatform(): String {
  23.  
    return "1.1";
  24.  
    }
学新通

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

  1.  
    class FlutterPlugin {
  2.  
    static const MethodChannel _channel = MethodChannel('flutter/flutter_plugin');
  3.  
     
  4.  
    static Future<String> testText({required String testString}) async {
  5.  
    Map<String, dynamic> testMap = {
  6.  
    "test": shareString,
  7.  
    };
  8.  
    final String result = await _channel.invokeMethod('testText', shareMap);
  9.  
    Print.print("testText result--> " result);
  10.  
    return result;
  11.  
    }

Native 端实现 android 为例

  1.  
    public class FlutterPlugin implements MethodCallHandler, EventChannel.StreamHandler, FlutterPlugin {
  2.  
    private Context applicationContext;
  3.  
    private MethodChannel methodChannel;
  4.  
     
  5.  
    @Override
  6.  
    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
  7.  
    if (call.method.equals("test")) {
  8.  
    String test = call.argument("test");
  9.  
    Log.d(TAG, "test value " test);
  10.  
    result.success("share success");
  11.  
    } else {
  12.  
    result.notImplemented();
  13.  
    }
  14.  
    }
  15.  
     
  16.  
    @Override
  17.  
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
  18.  
    Log.d(TAG, "onAttachedToEngine");
  19.  
    onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger());
  20.  
    }
  21.  
     
  22.  
    private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) {
  23.  
    this.applicationContext = applicationContext;
  24.  
    methodChannel = new MethodChannel(messenger, "flutter/flutter_plugin");
  25.  
    methodChannel.setMethodCallHandler(this);
  26.  
    }
  27.  
     
  28.  
    @Override
  29.  
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
  30.  
    applicationContext = null;
  31.  
    methodChannel.setMethodCallHandler(null);
  32.  
    methodChannel = null;
  33.  
    }
  34.  
     
  35.  
    // FlutterTestActivity
  36.  
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
  37.  
    super.configureFlutterEngine(flutterEngine)
  38.  
    flutterEngine.plugins.add(FlutterUmengPlugin()) // 添加插件
  39.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcakec
系列文章
更多 icon
同类精品
更多 icon
继续加载