首页 > 其他分享 >flutter 插件开发

flutter 插件开发

时间:2024-07-04 11:35:12浏览次数:22  
标签:插件 -- ios example 开发 mypl flutter

先引用一段官方的介绍说明:

https://docs.flutter.cn/packages-and-plugins/developing-packages

Package 包含以下几种类别:

纯 Dart 库 (Dart packages)
用 Dart 编写的传统 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如 fluro。

原生插件 (Plugin packages)
使用 Dart 编写的,按需使用 Java 或 Kotlin、Objective-C 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。

插件 package 可以针对 Android(使用 Kotlin 或 Java)、 iOS(使用 Swift 或 Objective-C)、Web、macOS、Windows 或 Linux,又或者它们的各种组合方式,进行编写。

今天主要学习一下原生插件 (Plugin packages)的开发。

创建插件项目:

下面是官方给出的创建例子:创建一个 组织名称为com.example,支持android,ios,linux,macos,windows平台的 指定android开发语言为kotlin ios开发语言为Objective-c 项目名称为hello的插件

flutter create --org com.example --template=plugin --platforms=android,ios,linux,macos,windows -a kotlin -i objc hello

--org后面跟的是组织名称,--platforms=后面跟的是支持的平台,可以通过-a -i 来指定安卓和ios平台的开发语言

根据我们的需求需要创建一个名称为 mypl,组织名为com.hczhhm, 支持安卓和ios平台的插件,这里选择

Java做安卓的开发语言,swift作为ios的开发语言:

flutter create --org com.hczhhm --template=plugin --platforms=android,ios -i swift -a java mypl

创建完成后目录如下:

用VSCode打开

最外层pubspec.yaml文件里 有个homepage报错,需要填写你插件在github上的主页,可以先注释掉,等插件完成上传后再添加

一. ios 插件开发

下面我们先讲怎么开发ios的插件代码,后面再讲安卓的。

下面内容来自官方说明:

使用 Xcode 编辑 iOS 平台代码之前,首先确保代码至少被构建过一次(即从 IDE/编辑器执行示例程序,或在终端中执行以下命令: cd hello/example; flutter build ios --no-codesign --config-

only)。

在我这就是

cd mypl/example

然后运行:

flutter build ios --no-codesign --config-only

这个时候会安装 依赖包 构建项目。 完成后用xcode打开 mypl/example/ios 项目:

在VSCode里用 Open in Xcode打开 或者直接打开mypl/example/ios目录下的 Runner.xcworkspace 文件

打开后先用跑一遍模拟器,如果可以跑成功就可以进行后续开发了。

ios开发的代码位置在:

Pods/Development Pods/mypl/../../example/ios/.symlinks/plugins/mypl/ios/Classes 下

下面添加两个简单的方法,把流程跑一遍

1.先在ios代码里添加两个方法标识符:test1,test2,并学着返回数据

2.在 mypl_method_channel.dart 中新增两个方法的调用代码:

3.在mypl_platform_interface.dart 中新增方法未实现时抛出的错误提示

4.在mypl.dart 中调用方法

5.在main.dart 调用插件方法

下面为main.dart修改后的代码

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:mypl/mypl.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  String _test1 = 'Unknown';
  String _test2 = 'Unknown';
  final _myplPlugin = Mypl();

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    String platformVersion;
    String test1;
    String test2;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.
    try {
      platformVersion =
          await _myplPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    try {
      test1 = await _myplPlugin.test1() ?? 'Unknown platform version';
    } on PlatformException {
      test1 = 'Failed to get platform version.';
    }
    try {
      test2 = await _myplPlugin.test2() ?? 'Unknown platform version';
    } on PlatformException {
      test2 = 'Failed to get platform version.';
    }
    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
      _test1 = test1;
      _test2 = test2;
    });
  }

  @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'),
            Text('Running on: $_test1\n'),
            Text('Running on: $_test2\n'),
          ],
        )),
      ),
    );
  }
}

6.运行项目,就可以见到新增的代码效果了,因为图片太大了,这里就不放了

7.添加第三方SDK,具体配置请参考微信文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
因为微信SDK文档默认用oc进行开发,我这里把之前创建的ios插件支持swift的删了,重新创建成支持oc的项目了,请大家注意。 下面以ios为例:在 mypl/example/ios/Podfile 中添加 pod 'WechatOpenSDK-XCFramework', '~> 2.0.4'

  1. mypl/ios/mypl.podspec s.dependency 'Flutter' 下面添加 s.dependency 'WechatOpenSDK-XCFramework', '2.0.4''

9.添加完成后 cd mypl/example/ios ,然后 pod install 安装sdk

10.引入头文件,然后在Xcode上运行一下项目,如果可以跑起来,就说明第三方库引入成功

二.安卓插件开发

1.构建项目

下面说明来自官方文档

在 Android Studio 中编辑 Android 平台的代码之前,请先确保代码至少已经构建过一次(换句话说,在 IDE 或编辑器中运行一次示例应用,或者在终端中执行指令 cd hello/example; flutter build apk --config-only)。

在我这里就是 cd mypl/example 然后执行 flutter build apk --config-only

2.打开项目,同步Gradle

项目需要同步Gradle文件,这个过程会非常缓慢,如果想快一些,可以先打开梯子,再进行下面的打开项目操作,同步完再关闭梯子。不想用梯子可以直接打开项目,如果嫌时间慢,又不想使用梯子,可以在网上找配置使用国内源的方法。

以下说明来自官方文档:

1.启动 Android Studio;

2.在 Android Studio 的欢迎菜单 (Welcome to Android Studio) 对话框中选择打开现有的 Android Studio 项目 (Open an existing Android Studio Project),或在菜单中选择 File > Open,然后选择 mypl/example/android/build.gradle 文件;

3.在Gradle Sync 对话框中,选择 OK;

4.在“Android Gradle Plugin Update”对话框中,选择“Don't remind me again for this project”。

插件中与 Android 系统徐相关的代码在 hello/java/com.example.hello/HelloPlugin 这个文件里

官方说明里的hello对应我这里的mypl。

我是使用 Open in Android Studio 方法打开的

打开后双击 build.gradle 来到 build.gradle中,看到 Gradle project sync in progress 正在同步Gradle文件,不用梯子可能需要等十几到半个小时分钟,如果嫌时间慢,又不想使用梯子,可以在网上找配置使用国内源的方法。

同步成功后就可以进行开发了。

3.插件开发目录位于mypl/java/com.hczhhm.mypl/

因为之前删除了项目,重建创建了支持 objective-c 和java的项目,所以 test1和test2方法需要重新创建,流程参考ios项目里flutter代码的编写,flutter编写完成后,下面我们只要编写java代码实现就好了

以上是简单的安卓插件方法创建调用流程。

4.下面对安卓进行微信SDK导入,具体配置请参考微信文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html

打开 mypl/build.gradle 在最下面添加:

dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

保存后,点击右上角 Sync Now 同步Gradle文件

同步完成后,在MyplPlugin文件中调用微信Sdk方法测试一下,我这边代码里的 this 报错,使用IDEA自动修复后,可以正常运行,表示sdk集成成功。

至此插件开发的第一步完成了,后面有时间我会继续更新微信Sdk集成的后续开发过程。如果本文存在问题,希望各位大神可以帮忙指出,在此表示感谢。

参考文章:https://docs.flutter.cn/packages-and-plugins/developing-packages
https://www.cnblogs.com/876013676ch/p/10187258.html

标签:插件,--,ios,example,开发,mypl,flutter
From: https://www.cnblogs.com/huangczh/p/18282525

相关文章

  • 手工转测试开发成功秘籍揭秘:从裁员到入职18k+,收获4个Offer,道阻且长不怯步
    我之前是在一家金融公司工作,每天过得很安逸,同事也很互助和友爱,但是我的工作能力方面却一直没有很大的提升。大部分工作时间都是在做功能测试,每个季度会有一个接口自动化的考核目标。正是因为这样的环境,我开始意识到这是一个温水煮青蛙的环境,如果我一直维持现状,离开这家公司时,不论......
  • 开发一个题库系统App和小程序的心得
    序言对于一名开发者来说,独自开发一款小程序与App,也许总会有一些疑问: 1.需要掌握哪些技术?答:java、vue、及常规Linux命令 2.需要多少成本?答:服务器购买,云服务器新人50多三年;域名购买,10块的域名够用,后续每年30左右的续期费用;短信套餐购买,50块钱,够用很久了;微信小程序发布,......
  • 采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式
    采用Java语言+开发工具Idea+scode数字化产科管理平台源码,产科管理新模式数字化产科管理系统是现代医疗信息化建设的重要组成部分,它利用现代信息技术手段,对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理,以提升医疗服务质量和效率;以下是对数字化......
  • 禅道二次开发——禅道zentaoPHP框架扩展机制——对控制层扩展
    对现有模块的control层的扩展有两种,一种是覆盖现有的方法,一种是增加新的方法。下面我们来看下如何进行扩展。......
  • 下载Animatediff插件后却并没有显示在web-UI上,解决了!
    看了很多其他大佬的资料,控制台也显示说是缺少imageio模块,尝试了几种方法,最后这个成功了!1、Animatediff插件方法显示成功方法:我用的web-UI是绘事2.8.5版本,打开高级选项右上角有个启动命令提示符输入这串代码,等待自动下载后就没问题了!python-pipinstallimgaug......
  • 混合开发H5页面的数字字体在IOS 安卓上显示不一样
    背景做完H5页面,UI走查的时候,发现IOS下数字的字体不对,安卓下是正常的,于是就查了下原因,以此做个记录看下实际效果左边是安卓,右边是IOS的效果,明显看出来数字的字体是不一样的安卓、IOS字体不一致的原因在安卓、IOS系统中,如果没有专门设置字体的话,会使用默认的字体,汉字,英文......
  • Java程序员转到AI大模型开发的路线_java转ai
    从Java开发转向AI大模型开发,需要系统地学习和掌握一系列新的技术和算法。以下是一条推荐的学习路线:数学与统计学基础:线性代数:矩阵运算、特征值与特征向量等。概率论与统计学:概率分布、假设检验、最大似然估计、贝叶斯推断等。微积分:梯度求解和优化理论。机器学习入门:......
  • JAVA开发环境的搭建(JDK下载与安装)
    一、什么是JDK、JREJDK(JavaDevelopmentKit):是Java程序开发工具包,包含JRE和开发人员使用的工具。JRE(JavaRuntimeEnvironment):是Java程序的运行时环境,包含JVM和运行时所需要的核心类库。小结:        JDK=JRE+开发工具集(例如Javac编译工具等)        ......
  • Flutter——最详细(Badge)使用教程
    背景主要常用于组件叠加上圆点提示;使用场景,消息数量提示,消息红点提示属性作用backgroundColor红点背景色smallSize设置红点大小isLabelVisible是否显示offset设置红点位置alignment设置红点位置child设置底部组件代码块classBadgePageextendsStatelessWidget{......
  • 35岁了,还能转行做鸿蒙开发吗?
    随着互联网行业的蓬勃发展时,不止从何时网上开始就有了:“程序员30岁危机、35岁中年危机”这种类似的话题,可以说影响了不少程序员。人们一般常说的是三十而立,一个人应该对生活、职业、个人信仰等方面有了明确的认识和规划,能够独立地承担起自己的责任和义务,开始在社会上立足......