blog icon indicating copy to clipboard operation
blog copied to clipboard

Flutter Plugin/Package: publish a package + reuse native libs

Open hhstore opened this issue 3 years ago • 7 comments

related:

  • [x] #384
  • [x] #242

hhstore avatar Dec 10 '20 04:12 hhstore

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

hhstore avatar Dec 10 '20 04:12 hhstore

flutter platform channels: 编写平台相关代码

  • ✅ https://flutter.cn/docs/development/platform-integration/platform-channels

数据类型 - 映射表:

  • ✅ https://flutter.dev/docs/development/platform-integration/platform-channels#codec

image

  • ✅ 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

hhstore avatar Dec 10 '20 04:12 hhstore

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

特别说明:

  1. 需要主动在 Android 包平台, 主动发包:

package eu.simonbinder.sqlite3_flutter_libs;


  1. 需要主动在 iOS/macos 包平台主动发包:
  • https://github.com/simolus3/sqlite3.dart/blob/master/sqlite3_flutter_libs/macos/sqlite3_flutter_libs.podspec


hhstore avatar Jan 14 '21 10:01 hhstore

1

hhstore avatar Sep 06 '22 05:09 hhstore

android aar 包平台:

  • https://search.maven.org/artifact/eu.simonbinder/sqlite3-native-library/3.37.2/aar

ios/macos 包平台:

  • https://cocoapods.org/

hhstore avatar Sep 06 '22 05:09 hhstore

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

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

hhstore avatar Sep 06 '22 05:09 hhstore

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"
}



hhstore avatar Sep 06 '22 05:09 hhstore