序文
最近、Androidアプリのバージョンを更新するために空き時間にFlutterプラグインを開発しました:flutter_xupdate、開発プロセス中にピットが発生しなかったことがわかりましたが、Flutterプラグインプラットフォームに公開するときに多くの問題が発生しました。ここで記録します私をフォローしている人たちにアドバイスをさせてください。
Flutterプラグインプラグインの開発
1. FlutterPluginプラグインプロジェクトを作成します
Android Studioを使用してプロジェクトを作成することをお勧めします。プロンプトに従って、手順を追って説明します。スクリーンショットは次のとおりです。
生成されたプロジェクトディレクトリには、主に次の内容が含まれています。
- 「android」ディレクトリは、AndroidプラットフォームでのプラグインAPIの実装です。
- 「ios」ディレクトリは、iOSプラットフォームでのプラグインAPIの実装です。
- 「example」ディレクトリは、プラグインを使用したサンプルプロジェクトです。
- 「lib」ディレクトリ内のファイルは、主に「MethodChannel」を作成し、ネイティブプラットフォームからメッセージを受信して処理するために使用されます
2.プラグイン機能を実装する
ここでは主にAndroid側のAPI実装を紹介します。
ピット1:Flutterプラグインの読み込みには2つのバージョンがあります
Flutterがプラグインに自動的に依存する方法には2つのバージョン(RegistrarとFlutterPluginBinding)があるため、Androidプラグインを実装する場合、互換性を向上させるために、両方を実装するのが最善です。したがって、Androidプラグインを実装する必要があります。FlutterPlugin
、ActivityAware
、MethodCallHandler
これらの3つのインターフェースは、私の撮影flutter_xupdate次のように、一例として、プラグインを実装しています。
public class FlutterXUpdatePlugin implements FlutterPlugin, ActivityAware, MethodCallHandler {
private static final String PLUGIN_NAME = "com.xuexiang/flutter_xupdate";
private MethodChannel mMethodChannel;
private Application mApplication;
private WeakReference<Activity> mActivity;
//此处是新的插件加载注册方式
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
mMethodChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), PLUGIN_NAME);
mApplication = (Application) flutterPluginBinding.getApplicationContext();
mMethodChannel.setMethodCallHandler(this);
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
mMethodChannel.setMethodCallHandler(null);
mMethodChannel = null;
}
public FlutterXUpdatePlugin initPlugin(MethodChannel methodChannel, Registrar registrar) {
mMethodChannel = methodChannel;
mApplication = (Application) registrar.context().getApplicationContext();
mActivity = new WeakReference<>(registrar.activity());
return this;
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
switch (call.method) {
case "getPlatformVersion":
result.success("Android " + android.os.Build.VERSION.RELEASE);
break;
case "initXUpdate":
initXUpdate(call, result);
break;
...
default:
result.notImplemented();
break;
}
}
@Override
public void onAttachedToActivity(ActivityPluginBinding binding) {
mActivity = new WeakReference<>(binding.getActivity());
}
@Override
public void onDetachedFromActivityForConfigChanges() {
}
@Override
public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
}
@Override
public void onDetachedFromActivity() {
mActivity = null;
}
//此处是旧的插件加载注册方式
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), PLUGIN_NAME);
channel.setMethodCallHandler(new FlutterXUpdatePlugin().initPlugin(channel, registrar));
}
}
上記のコードは注意を払う必要があります:
registerWith
静的メソッドは、リフレクションを介してロードされる、プラグインをロードするフラッターの古い方法です。onAttachedToEngine
andonDetachedFromEngine
yesFlutterPlugin
インターフェースメソッドは、プラグインをロードするflutterの新しい方法です。onAttachedToActivity
andonDetachedFromActivity
yesActivityAware
インターフェースメソッドは、主に現在のフラッターページが配置されているアクティビティを取得するために使用されます。onMethodCall
はいMethodCallHandler
、インターフェイスメソッドは主にFlutterからネイティブメソッド呼び出しの実装を受信するために使用されます。
ピット2:ネイティブとフラッター間のデータ相互作用のタイプには制限があります
プラグインを開発するときは、ネイティブとフラッターの間のデータの相互作用を伴う必要があります。ここでは、react-nativeとJNIを開発するときと同様に、すべてのタイプのデータがサポートされているわけではないことに注意してください。インタラクティブ。以下に、ネイティブとフラッターの間のインタラクティブなデータタイプを示します。
ダート | アンドロイド | iOS |
---|---|---|
ヌル | ヌル | nil(ネストされている場合はNSNull) |
ブール | java.lang.Boolean | NSNumber numberWithBool: |
int | java.lang.Integer | NSNumber numberWithInt: |
int、32ビットでは不十分な場合 | java.lang.Long | NSNumber numberWithLong: |
ダブル | java.lang.Double | NSNumber numberWithDouble: |
ストリング | java.lang.String | NSString |
Uint8List | バイト[] | FlutterStandardTypedData typedDataWithBytes: |
Int32List | int [] | FlutterStandardTypedData typedDataWithInt32: |
Int64List | 長いです[] | FlutterStandardTypedData typedDataWithInt64: |
Float64List | ダブル[] | FlutterStandardTypedData typedDataWithFloat64: |
リスト | java.util.ArrayList | NSArray |
地図 | java.util.HashMap | NSDictionary |
ここでは、ほとんどを使用されbool
、int
、String
、Map
これらのタイプ
3.プラグインリリース
プラグインリリースはほとんどのピットに遭遇し、追加の注意が必要です。
ドキュメントを改善する
次のドキュメントをプラグインプロジェクトに追加することをお勧めします。
README.md
:パッケージを紹介するファイルCHANGELOG.md
各バージョンの変更を記録しますLICENSE
ソフトウェアパッケージのライセンス条項を含むファイル- すべてのパブリックAPIのAPIドキュメント
プラグインを公開
次のコマンドを実行して公開します。
flutter packages pub publish
終わったと思いますか?いやいや、下にピットが多すぎます!!
ピットポイント3:権限認証にはGoogleアカウントへのアクセスが必要です
プラグインをフラッタープラグインプラットフォームに公開するため、このプラットフォームがGoogleによって構築されていることを知る必要があります。公開する必要がある場合は、認証のためにGoogleアカウントにログインする必要があります。flutter packages pub publish
コマンドを入力すると、必要な認証リンクが表示されます。Googleアカウントにログインします。
中国ではGoogleにアクセスできないことを知るために、ここでGoogleアカウントにログインして認証する方法(あなたが知っている方法)を見つける必要があります。
ピット4:フラッター中国のネットワーク構築文書は有毒です
次の図に示すように、ここに大きな落とし穴があります。これは、オンラインのフラッターチャイニーズの環境構成の問題です。これは、
フラッターの一時ミラーの公式構成です。ほとんどの人が連絡を取りました。私は常に公式文書を段階的に追っていますが、このステップは絶対に不可欠だと思いますが、それは私が認証ステップで立ち往生するほど目立たないステップです。インターネットで長い間解決策を見つけることは無意味です。その間にいくつかもあります。ミラーリングの問題が原因だと言われていますが、あえてこの問題が原因だとは思いません。
ここで、ミラー構成を削除して認証に合格できます。
ピットポイント5:科学的なインターネットツールはコマンド端末では機能しません
認証に合格するのは難しいと思いましたが、アップロードは常に成功しますが、Uploading...
再び事故が発生しました。行き詰まり、アップロードに失敗しました。
Uploading...
Failed to upload the package.
インターネット上のバイドゥでは、科学的なインターネットツールはコマンド端末では動作しないと言われており、コマンドラインのプロキシを設定する必要があります。
export https_proxy=http://127.0.0.1:1087
export http_proxy=http://127.0.0.1:1087
set https_proxy=https://127.0.0.1:1087
set http_proxy=http://127.0.0.1:1087
私は科学的なインターネットツールのMacバージョンである小さな飛行機を使用しているので、プロキシポートは1087
です。
ただし、この設定では正常にアップロードできません。privoxy
端末のプロキシを完了するには、ツールを使用する必要があります。操作は次のとおりです。
- privoxyをインストールします
brew install privoxy
- privoxy構成を変更する
vim /usr/local/etc/privoxy/config
これらの2つの構成を追加し(最初の行のポート番号は科学的なインターネットプロキシに基づいている必要があります。ここでは変更しませんでした。デフォルトは1087です)、最後のスペースとドットを忘れないように注意してください。
listen-address 0.0.0.0:1087
forward-socks5 / localhost:1080 .
- privoxyを開始します
sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config
開始したら、開始されているかどうかを確認しましょう。
netstat -na | grep 1087
次のような結果が表示された場合、起動は成功しています。
tcp4 0 0 127.0.0.1.1087 *.* LISTEN
この時点で再実行します。
export https_proxy=http://127.0.0.1:1087
export http_proxy=http://127.0.0.1:1087
set https_proxy=https://127.0.0.1:1087
set http_proxy=http://127.0.0.1:1087
最後に、releaseコマンドを実行します。
flutter packages pub publish
次の結果が表示された場合は、リリースが成功したことを示しています。
Waiting for your authorization...
Authorization received, processing...
Successfully authorized.
Uploading...
Successfully uploaded package.