FlutterPluginプラグイン開発および充填ガイド

序文

最近、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プラグインを実装する必要があります。FlutterPluginActivityAwareMethodCallHandlerこれらの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静的メソッドは、リフレクションを介してロードされる、プラグインをロードするフラッターの古い方法です。
  • onAttachedToEngineand onDetachedFromEngineyesFlutterPluginインターフェースメソッドは、プラグインをロードするflutterの新しい方法です。
  • onAttachedToActivityand onDetachedFromActivityyesActivityAwareインターフェースメソッドは、主に現在のフラッターページが配置されているアクティビティを取得するために使用されます。
  • 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

ここでは、ほとんどを使用されboolintStringMapこれらのタイプ

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.

関連リンク

公開なし

ここに写真の説明を挿入

交換グループ

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/xuexiangjys/article/details/104351616