Flutter 学习5:开发Dart包和插件包
这个是我学习Flutter的一个系列文章:
- Flutter 学习1:开发环境、开发工具、初始化一个项目
- Flutter 学习2:从main.dart文件说起
- Flutter 学习3:转场、导航
- Flutter 学习4:集成到原有的项目中
- Flutter 学习5:开发Dart包和插件包
- Flutter 学习6:绘制动画
- Flutter 学习7:Dart语言基础
- Flutter 学习8:BottomSheet
- Flutter 学习9:Positioned、Transform等控件使用以及手势控制
- Flutter 学习10:NestedScrollView、SliverAppBar、TabBar
在上面的列表中第二篇文章就说到过怎么使用一个外部的包,需要到pubspec.yaml
的dependencies中引入,然后到需要使用的Dart文件中import。外部包这种东西在开发中是很常见的了,它有可能是某种需求的UI库,也有可能是方便开发的工具库等等。
在Flutter中这中外部包分两种类型,一种叫Dart Packages
,它是纯Dart开发的,不涉及Native层的一些开发工具包或者UI包,比如前面用到english_words
。还有一种叫Plugin Packages
,它是涉及到Native层的,需要调用Native的原生代码的,可能是要调用硬件,比如获取电池电量等类似的功能库的。一个外部包至少包含一个pubspec.yaml
(声明一些包名称、版本、作者等数据的文件),一个lib
文件夹(包含公开的源代码,最少应该要有一个包名称命名的dart文件)。
前面的文章已经提到了,这些外部包有个官方的包管理的网站 ,现在已经有很多可用的包了,如果开发中想要用什么包,可以先去上面找找,有的话直接拿来用就不用重复造轮子了。当然肯定会有不满足需求的时候,那我们得学会自己开发!😊
Dart包开发
创建Dart包,跟前面建Flutter工程一样用 flutter create
命令,需要加一个template
参数:
$ flutter create --template=package hello_package
......
All done!
Your package code is in hello_package/lib/hello_package.dart
完成后生成的项目结构很简单:
hello_package/
lib/hello_package.dart
test/hello_package_test.dart
pubspec.yaml
在hello_package.dart实现你的包功能就行了。还有test文件夹下的hello_package_test.dart中可以进行单元测试。关于单元测试如何进行可以参考下官方的指导。
插件包开发
插件包相当于是Dart包的特殊版本,它包含了针对于特定平台(Android、IOS)有特定的实现。Flutter的API通过平台的通道和指定平台进行通信。
创建插件包的命令和前面Dart包类似,就是把template
参数改成plugin
:
$ flutter create --template=plugin hello_plugin
因为涉及到Android和IOS平台,所以会生成Android和IOS平台代码,所以多了几个参数,和创建Flutter工程一样,可以指定Android IOS的包名、开发语言等:
$ flutter create --org=muliba.net --template=plugin -i swift -a kotlin hello_plugin
生成的目录结构和Dart包不一样的是test目录变成了example目录,是一个完整的flutter项目目录。一个android目录,插件包的android端实现。一个ios目录,插件包的ios端实现。
hello_plugin/
lib/hello_plugin.dart
example/
android/
ios/
lib/
test/
pubspec.yaml
android/
ios/
pubspec.yaml
所以通过这个目录结构就可以很清楚了解到了,在lib/hello_plugin.dart
中实现插件包的对外功能,比如包括提供给别人用的Widget、工具函数等。自动生成的代码就是获取当前手机平台的版本号:
static Future<String> get platformVersion async {
final String version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
代码就提供给使用者一个异步获取平台版本的函数。分别看Android端和IOS端的代码实现:
Android端
在android
目录中实现Android 端获取版本号的代码,在编写代码之前,要先用Android Studio对这个android目录进行构建一次。
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
}
}
IOS端
在ios
目录中实现IOS 端获取版本号的代码,在IOS编写代码之前也要用xcode构建一遍。
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
result("iOS " + UIDevice.current.systemVersion)
}
发布packages
我们编写插件就是为了给别的项目或者其他人使用的,所以肯定要发布到Pub上,这样别人才可以在自己的flutter项目中依赖使用。
发布之前先检查pubspec.yaml
、README.md、CHANGELOG.md等文件是否已经准备好了。
运行 dry-run 命令以查看是否都准备OK了:
$ flutter packages pub publish --dry-run
最后发布:
$ flutter packages pub publish