Flutter 学习 之 MethodChannel 与Android 原生交互

官方教程 : 撰写双端平台代码 [flutter plugin
]https://flutter.cn/docs/development/packages-and-plugins/developing-packages
本来想按照教程按部就班的写的时候发现都堆在了MainActivity里不是很美观,偶然看到发布flutter plugin插件实现的功能好像是一样的 就试了一下

1. 打开androidStudio 创建一个新的FlutterPlugin (我更习惯写java 这里可以随便选 看你项目是用什么语言的)

屏幕截图 2022-04-27 200014.png

2. 取出它的Dart放到你的dart文件夹中去


import 'dart:async';

import 'package:flutter/services.dart';

class Untitled {
  ///这里你起一个美丽的名字 越独一无二越好 但是这个名字要和你的原生端保持一致
  static const MethodChannel _channel = MethodChannel('com.xxx.xxx/untitled');

  static Future<String?> get platformVersion async {
    final String? version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }
}

3. 取出他的java 文件放在Android端下面

public class UntitledPlugin implements FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private MethodChannel channel;
    private FlutterActivity activity;
///构造函数 有些时候调用原生方法可能需要activity 就传进来了 

UntitledPlugin(FlutterActivity activity) {
        this.activity = activity;
    }

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
     ///这个地方就是换你独一无二的名字的地方 
    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.xxx.xxx/untitled");
    channel.setMethodCallHandler(this);
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
//这里是你要实现的方法 
    if (call.method.equals("getPlatformVersion")) {
      result.success("Android " + android.os.Build.VERSION.RELEASE);
    } else {
      result.notImplemented();
    }
  }

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

4. 引用插件 官方是说在 文件中引用 我直接在MainActivity中注册了

///仿照GeneratedPluginRegistrant 中的Plugin注册方式 
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        // 引入你写的插件
        try {
            flutterEngine.getPlugins().add(new UntitledPlugin(this));
        } catch (Exception e) {
            Log.e(getLocalClassName(), "Error registering pluginCustomChannelPlugin,", e);
        }
    }

5. 按官方给的例子修改就可以了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容