flutter插件开发是一个重要的技能,拓展flutter与原生的通信,将一些公用的东西封装,给差别的项目使用。
阅读前置:
flutter根本通道调用
objective-c底子语法
ios项目底子知识
Github代码地点:传送门 求Star✨
插件开发
1、创建一个插件项目
创建一个ios原生的插件项目,指定平台为ios,语言为objective-c,也可以是android平台等等。
- flutter create -t plugin --platforms=ios --ios-language=objc add_helper
复制代码 2、项目布局
example是该项目内置的一个资助测试我们开发的插件代码的dart项目
从pubspec.yaml文件中可看出,依靠的就是即将开发的插件项目
lib中有三个文件
- add_helper.dart
- add_helper_method_channel.dart
- add_helper_platform_interface.dart
这三个文件应该倒着理解,看一下interface内里,这就是一个抽象的通道平台接口,内里界说与原生通道的方法,内里就内置了一个官方的例子,获取平台版本号的方法抽象。
- Future<String?> getPlatformVersion() {
- throw UnimplementedError('platformVersion() has not been implemented.');
- }
- ///添加一个自定义的方法
- Future<int?> add(int a, int b) {
- throw UnimplementedError('add() has not been implemented.');
- }
复制代码 可以添加自界说的方法,测试文件大概会报错,点进去暴力解释掉就行,method_channel就是platform_interface的实现
- @override
- Future<String?> getPlatformVersion() async {
- final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
- return version;
- }
- @override
- Future<int?> add(int a, int b) async {
- final result = await methodChannel.invokeMethod<int>('add', <String, int>{
- 'a': a,
- 'b': b,
- });
- return result;
- }
复制代码 末了这些方法在第一个文件统一通过一个类再封装方法给必要用到的地方的调用。
- class AddHelper {
- Future<String?> getPlatformVersion() {
- return AddHelperPlatform.instance.getPlatformVersion();
- }
- Future<int?> add(int a, int b) {
- return AddHelperPlatform.instance.add(a, b);
- }
- }
复制代码 3、编写原生代码
因为我们天生的是oc代码,所以这里是这样子的,接下来必要初始化ios项目,进入example,执行
成功后,打开xcode,打开example下的ios,既然是编写原生插件,就在原生项目中举行开发,插件的代码是被集成在了pod内里的,可以看到,位置很深
添加原生处理代码,只必要在获取版本的方法后面加一个case就行
- - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
- if ([@"getPlatformVersion" isEqualToString:call.method]) {
- result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
- } else if ([@"add" isEqualToString:call.method]) {
- int a = [call.arguments[@"a"] intValue];
- int b = [call.arguments[@"b"] intValue];
- result(@(a + b));
- } else {
- result(FlutterMethodNotImplemented);
- }
- }
复制代码 4、编写flutter端测试代码
回到android studio,/add_helper/example/lib/main.dart中编写
- int totalCount = 0;
- ///
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: Center(
- child: Column(
- children: [
- Text('Running on: $_platformVersion\n'),
- ElevatedButton(
- onPressed: () async {
- int? val = await _addHelperPlugin.add(totalCount, 1);
- setState(() {
- totalCount = val ?? -1;
- });
- },
- child: Text('totalCount: $totalCount'),
- )
- ],
- ),
- ),
- ),
- );
- }
复制代码 运行项目:
插件管理以及集成
开发好的插件应该作为一个git项目举行管理(企业中的sdk大部分sdk是不能开源的),必要举行管理,将刚才的开发好的add_helper插件上传到github仓库,那么如安在主项目中引用呢?
1、创建一个空项目
记得git init,因为后面是要通过submodule管理项目。
2、添加项目
可以创建在项目下创建一个plugin文件夹统一管理插件,如下命令添加项目,拉下来后可以手动把文件夹拖到plugin下。(Github代码地点:传送门 求Star✨,大家可以用这个项目举行练习!
- git submodule add git@github.com:CabLd/add_helper.git
复制代码 自动天生了.gitmodules文件举行管理,
example删掉,因为这是之前测试插件的内置项目,以及多余的文件也可以删掉(当然这种做法是不公道的,插件项目创建的开始就应该删掉多余的东西,通过其他项目引入该插件,在其他项目中举行调试)
pubspec.yaml添加代码
- dev_dependencies:
- flutter_test:
- sdk: flutter
- add_helper:
- path: ./plugin/add_helper
复制代码 不要忘记执行
末了将之前exmaple下的main.dart文件直接cv过来,运行成功!
参考文档:
Flutter插件开发指南01: 通道Channel的编写与实现
Writing custom platform-specific code
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |