blog
blog copied to clipboard
Flutter Plugin/Package: publish a package + reuse native libs
related:
- [x] #384
- [x] #242
flutter 开发+发布一个库/插件:
- ✅ flutter 区分 package(库) 和 plugin(插件).
二者区别:
- ✅ package: 对应 dart 原生代码实现.
- 官方: https://github.com/flutter/packages
- ✅ plugin: 通常是针对各 OS 平台下的其他宿主语言实现, 通过 FFI 等 binding 的插件.
- 官方: https://github.com/flutter/plugins
1. 创建包目录:
1.1 package:
- ✅ https://flutter.dev/docs/development/packages-and-plugins/developing-packages#dart
创建指令:
- ✅ 创建包目录:
flutter create --template=package hello
- ✅ 基于
@JS()
wrap 原生 js lib 给 dart 使用. - ✅ https://codeburst.io/how-to-use-javascript-libraries-in-your-dart-applications-e44668b8595d
1.2 plugin:
- ✅ flutter + 原生(iOS/Android) 插件包:
- ✅ 复用
Android/iOS
原生 lib. - ✅ 桥接原生 lib 代码, 弥补 flutter 涉及平台相关的 lib 短板.
- ✅ https://flutter.dev/docs/development/packages-and-plugins/developing-packages
创建指令:
- ✅ 创建flutter 插件目录:
# Android:
flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin hello
flutter create --org com.example --template=plugin --platforms=android,ios -a java hello
# iOS:
flutter create --org com.example --template=plugin --platforms=android,ios -i objc hello
flutter create --org com.example --template=plugin --platforms=android,ios -i swift hello
- ✅ 创建完, 添加某平台支持:
flutter create --template=plugin --platforms=web .
2. 发布包:
- ✅ 发布包指令:
- ✅ 需要预先准备 gmail 账号, 先注册 dart 开发者平台账号.
# 测试:
flutter pub publish --dry-run
# 发布:
flutter pub publish
3. 原生依赖处理:
- ✅ https://flutter.dev/docs/development/packages-and-plugins/developing-packages#dependencies
- ✅ Android: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#android
- ✅ iOS: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#ios
flutter platform channels: 编写平台相关代码
- ✅ https://flutter.cn/docs/development/platform-integration/platform-channels
数据类型 - 映射表:
- ✅ https://flutter.dev/docs/development/platform-integration/platform-channels#codec
- ✅ https://flutter.dev/docs/development/platform-integration/platform-channels
MethodChannel:
- ✅ https://api.flutter.dev/flutter/services/MethodChannel-class.html
Pigeon:
- ✅ https://pub.dev/packages/pigeon
- ✅ https://github.com/flutter/packages/tree/master/packages/pigeon
测试:
- ✅ https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration#testing-your-plugin
flutter plugin:
- https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-platforms
- 指定支持的平台
参考示例 1:
- https://github.com/better-dart/flutter_trust_wallet_core
- ⭐️⭐️⭐️⭐️⭐️
- https://github.com/Sunbreak/cronet_flutter/blob/master/lib/cronet_flutter.dart#L16
- ⭐️⭐️⭐️⭐️⭐️
- https://github.com/Sunbreak/cronet.dart
- 依赖的二进制 bin 文件
参考示例 2:
- https://pub.dev/packages/url_launcher
- 配置文件写法: https://github.com/flutter/plugins/blob/main/packages/url_launcher/url_launcher/pubspec.yaml
示例3:
- https://github.com/simolus3/sqlite3.dart/blob/master/sqlite3_flutter_libs/pubspec.yaml#L21
- https://github.com/simolus3/sqlite3.dart/tree/master/sqlite3_flutter_libs
查找动态库:
- https://github.com/simolus3/sqlite3.dart/blob/master/sqlite3_flutter_libs/lib/sqlite3_flutter_libs.dart#L28
Android 依赖包:
- https://github.com/simolus3/sqlite3.dart/blob/master/sqlite3_flutter_libs/android/build.gradle#L29
- maven 包仓库:
- https://github.com/simolus3/drift/issues/542
- https://search.maven.org/artifact/eu.simonbinder/sqlite3-native-library/3.37.2/aar
特别说明:
- 需要主动在 Android 包平台, 主动发包:
package eu.simonbinder.sqlite3_flutter_libs;
- 需要主动在 iOS/macos 包平台主动发包:
- https://github.com/simolus3/sqlite3.dart/blob/master/sqlite3_flutter_libs/macos/sqlite3_flutter_libs.podspec
1
android aar 包平台:
- https://search.maven.org/artifact/eu.simonbinder/sqlite3-native-library/3.37.2/aar
ios/macos 包平台:
- https://cocoapods.org/
iOS + ffi:
- https://docs.flutter.dev/development/platform-integration/ios/c-interop
- https://flutter.cn/docs/development/platform-integration/ios/c-interop#compiled-dynamic-library-macos
- ⭐️⭐️⭐️⭐️
- https://flutter.cn/docs/development/platform-integration/ios/c-interop#closed-source-third-party-library
- ⭐️⭐️⭐️⭐️
示例配置:
MacOS + ffi:
-
https://flutter.cn/docs/development/platform-integration/macos/c-interop#compiled-dynamic-library-macos
-
添加二进制包(闭源)
-
⭐️⭐️⭐️⭐️
-
https://docs.flutter.dev/development/platform-integration/macos/c-interop
-
静态链接中的符号可以使用 DynamicLibrary.executable 或 DynamicLibrary.process 来加载。
-
相比之下,动态链接库则分布在应用程序中的单独的文件或文件夹中,并按需加载。
-
在 macOS 上,它是作为 .framework 文件夹分发的。
![image](https://user-images.githubusercontent.com/3252130/188629612-89366ecc-55f9-4dbf-9ccb-9a09ae0c7a73.png)
Android + ffi:
- https://docs.flutter.dev/development/platform-integration/android/c-interop
Windows + ffi :
- https://docs.flutter.dev/development/platform-integration/windows/building
示例:
- https://pub.dev/packages/win32
Mono Repo for Dart:
- 统一大仓库
工具:
- ✅ https://github.com/invertase/melos
- ✅ https://docs.page/invertase/melos/getting-started
mono repo:
- ✅ https://github.com/better-dart/pkg
- ✅ 所有的 dart lib 统一放在这里.
# 激活工具:
dart pub global activate melos
注意事项:
- ✅ 这个项目, 不能使用 国内镜像源, 否则会报错, 提示找不到 Android studio 项目配置模板文件.
function set.proxy.flutter.cn(){
# mirror: https://mirrors.tuna.tsinghua.edu.cn/help/flutter/
# 社区:
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
# 清华大学:
#export FLUTTER_STORAGE_BASE_URL="https://mirrors.tuna.tsinghua.edu.cn/flutter"
#export PUB_HOSTED_URL="https://mirrors.tuna.tsinghua.edu.cn/dart-pub"
}
# defalut use cn mirror:
set.proxy.flutter.cn
# unset:
function unset.proxy.flutter() {
unset PUB_HOSTED_URL
unset FLUTTER_STORAGE_BASE_URL
export PUB_HOSTED_URL=""
export FLUTTER_STORAGE_BASE_URL=""
echo "unset flutter proxy"
}