Flutter学习:插件开发

艾骏
2023-12-01

Package 类别

Package 包含以下两种类别:

  • 纯 Dart 库:用 Dart 编写的传统 package,比如path。其中一些可能包含 Flutter的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如fluro。
  • 原生插件:使用 Dart 编写的,按需使用Java 或 Kotlin、ObjC 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。一个具体的例子是 battery。

纯 Dart 库的 packages

创建
flutter create --template=package hello

得到一个模板工程,在pubspec.yaml中的name就是该package的library名,也是外部引用的名称。
本地引用

dev_dependencies:
  hello:
    path: '/Users/jneth/Desktop/Flutter/flutter-awesome/sanwen/hello'

在dart文件中直接使用该package即可
import ‘package:hello/hello.dart’;
Calculator().addOne(number);

开发原生插件类型的 packages

flutter create --org com.example --template=plugin hello

lib下会有一个基础文件,一般内容如下:

  class HelloPlugin {
  static const MethodChannel _channel =
      const MethodChannel('hello_plugin');

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

对应的iOS代码

@implementation HelloPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
      methodChannelWithName:@"hello_plugin"
            binaryMessenger:[registrar messenger]];
  HelloPlugin* instance = [[HelloPlugin alloc] init];
  [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"getPlatformVersion" isEqualToString:call.method]) {
    result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
  } else {
    result(FlutterMethodNotImplemented);
  }
}

channel即是给桥梁构建一个专门的key,对应的Native中的。也可以自定义,也可以建立新的。

初始的platformVersion方法即是官方给的例子,这里是用来获取平台版本。其他的方法也可以按他的样子照葫芦画瓢

假如要带上参数,可以像下面这样填写

  static Future<Map> getUser(String uid) async {
    Map map = await _channel.invokeMethod("getUser", {
      "uid": uid,
    });
    return map;
  }

Flutter主动与Native主要是通过channel.invokeMethod,

@optionalTypeArgs
Future invokeMethod(String method, [ dynamic arguments ]) {
return _invokeMethod(method, missingOk: false, arguments: arguments);
}
method是与Native所对应的名称,唯一;arguments是传一个map,其他类型容易导致类型不正确,没有响应等问题。
oc代码

if ([@"getUser" isEqualToString:call.method]) {
        result(@{@"uid":call.arguments[@"uid"],@"name":@"jiang"});
    }
 类似资料: