基于Flutter Version:1.22.3, Dart Version:2.10.3
FlutterPlugin提供了Android和ios的底层封装,在Flutter层提供组件功能,使得Flutter可以比较方便得调用Native得模块,对于Flutter实现比较复杂或者基于平台不能完成得部分,都可以封装成Plugin。
本文都是android得样例。
Flutter调用android原生实现,封装成Plugin
基本流程
- Flutter端声明MethodChannel,并通过invokeMethod函数调用native的函数
- Android声明Plugin,创建与Flutter端对应的MethodChannel,对Flutter端声明的函数进行监听,并进行相应的处理
- 在Plugin机制中绑定两者的关系。
此处以调用Android原生的日志为例进行讲解
1.Flutter端声明一个log_util.dart文件
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';class LogUtils {///声明的通道名称static const String _channelName = 'flutter.io/system/log';///判断是否是debug环境static bool get _isDebug => !bool.fromEnvironment("dart.vm.product");///创建渠道对象static const _channel = const MethodChannel(_channelName);///通过命名函数来实现类似java中重载机制static void v({@required String message, String tag}) {if (_isDebug) {///调用函数来执行,///invokeMethod参数///[String method]:指定方法名,Android端需要监听并做处理的///[dynamic arguments]:需要传递给Android端的参数_channel.invokeMethod('logV', {'tag': tag ?? '', 'message': message ?? ''});}}static void d({@required String message, String tag}) {if (_isDebug) {_channel.invokeMethod('logD', {'tag': tag ?? '', 'message': message ?? ''});}}static void i({@required String message, String tag}) {if (_isDebug) {_channel.invokeMethod('logI', {'tag': tag ?? '', 'message': message ?? ''});}}static void w({@required String message, String tag}) {if (_isDebug) {_channel.invokeMethod('logW', {'tag': tag ?? '', 'message': message ?? ''});}}static void e({@required String message, String tag}) {if (_isDebug) {_channel.invokeMethod('logE', {'tag': tag ?? '', 'message': message ?? ''});}}
}
2.Android端plugin的编写
在android端的项目中有一个目录如下,
}
3.在FlutterEngine的plugin中添加LogPlugin建立关联
package com.example.flutter_first;import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.LogPlugin;public class MainActivity extends FlutterActivity {@Overridepublic void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {super.configureFlutterEngine(flutterEngine);flutterEngine.getPlugins().add(new LogPlugin());}}
调用如下: