Package 包含以下两种类别:
创建
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);
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"});
}