覚えていますか?それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

序文

みなさん、こんにちは!今日、私はアムウェイのオープンソースプロジェクトの比較的重いフラッターと思います。

フラッター製品定義は、高性能モバイルUIフレームワーク、クロスプラットフォームである、アンドロイド/ IOS /ウェブ/ MacOSのアプリケーション一方、コードのセットで構成することができます。UIフレームワークは、天然またはネイティブを扱う避けることができない、システムのインタフェースのいくつかを持っていません。以来、それはフラッターとネイティブ柔軟なデータ交換のためのプラットフォームチャネルと呼ばれるものを提示しています。説明の便宜上、それはネイティブのAndroidの世代を指します。

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

ガチョウ、ガチョウの燃料、燃料ガチョウを燃やし、それが唯一の基本データ型とデータ構造のいくつかの伝送をサポートし、例えばブール値/ INT /ロング/バイト/一覧/地図/] [文字/文字列/バイトのように。

あなたは、複雑なデータポイントを転送する際にそのため、あなただけのように、地図をパッケージ化することができます:

await _channel.invokeMethod('initUser',
    {'name': 'Oscar', 'age': 16, 'gender': 'MALE', 'country': 'China'});

そして、Androidの層、ハードコードは、キーに対応する異なるデータを解析されました。あなたは純粋なfluterプロジェクトに予定している場合、以降一切の契約とネイティブはありませんか、単にこのアプローチは理解できることを、簡単な相互作用を必要としています。そして、あなたのプロジェクトは、ネイティブコードの大部分となっている、またはあなたがlibにライブラリのフラッターをサポートしていないサードパーティ製を使用する必要がある場合、それはあなたが上にテンプレートとして多くのコードを記述する必要があることを意味する場合。非効率的な可視、および保守性。この時点で、あなたは次のようにオブジェクトを転送することができるようになるでしょう!

そして、あなたは、転送オブジェクトにしたいとき:

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

申し訳ありませんが、方法は、唯一の丁寧な笑顔ではありませんあなたに恥ずかしい危機を与えることはできません。もちろん、もありませんが、我々は、上側の第一の目的とJSONに配列を標的JSONして、フラッタフラッタにオブジェクト層になることができ、同じ効率が悪いです。

FIDLは何ですか

アンドロイドは、AIDL(アンドロイドインタフェースDefination Language)を知っている必要がありますつまりAndroidのインタフェース定義言語を学びました。アンドロイドがプロセス間通信--Binderのハイレベルであるが、メカニズムやAPIバインダーのいくつかを理解するためにバインダーの必要性を使用する場合、あなたは定型コードの多くを記述する必要があります。この問題を解決するには、Android、それを行うには白いバインダーの方法を使用してみてください。だから、AIDLは、開発者に伝え、定義された、あなたは私の要件に応じて、書き込みへのインターフェースを提出しなければならない、あなたは、オブジェクトを横断しなければならない転送プロセスParcelableインタフェースを実装する必要があります。その後、Androidは密かにオブジェクトの直列化の後ろに、あなたはService.Stubクラスを生成できます、直列化復元は、やるべき仕事を与えました。このクラスを使用している開発者は簡単に始めスタブバインダーこの高レベルのクロスプロセス通信方法を取得することができます。(私はちょっと、製)

静かFIDL(フラッタインタフェースDefination言語)インタフェース定義フラッタある言語、その使命とAIDL非常に類似した、オブジェクトのシリアライゼーション、デシリアライゼーション、自動コード生成行うために、このような「汚い仕事」。開発者は、自動的にダート及びネイティブコードクラスの同じ側の生成、@FIDLアノテーションタグにより、ネイティブコードクラスに見られます。FIDLはミラー、それぞれのネイティブインターネット上にマッピングされたダーツのクラスでネイティブプラットフォームダートにマッピングされた様々なクラスです。

以下、物事を見て、長いったらしいです

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

最初はJavaクラスです。

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

Androidの側

図1に示すように、インタフェースが定義されFIDL

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

2、ファイル名を指定して実行./gradlew assembleDebug、IUserServiceStub生成クラスファイルとfidl.json

図3は、チャネルを開くために、この方法は、フラッタを開示し

FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
}

フラッター側

1、ファイルがfidl.json FIDLディレクトリをコピーし、ファイル名を指定して実行フラッターパッケージパブの実行fidl_model、インタフェースクラスが生成されたダーツ

2、Androidの結合側通路IUserServiceStub

await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

3、パブリックメソッドを呼び出します

await IUserService.initUser(User());

コンパイルと実行は、あなたはオスカーが18歳Logcatで見ることができます!。

詳細なFIDL用途

この部分は、補足説明のどの部分で少し長いったらしい、見た目で、観客は祖父がスキップ所有することができます。

地図上の例では、一般的に、クラスにJava対応するであろう。

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

あなたはフラッター手動で書き込みUserクラスにフラッター層なしのこのオブジェクトの送信、および書き込みfromJson / toJsonメソッドが必要な場合は、これを行うことができます:

Androidの側

1、注釈@FIDLを追加し、インターフェイスを定義します。この注釈はannotationProcessorインタフェースを通知し、記述ファイルのいくつかの種類を生成します。

@FIDL
public interface IUserService {
  void initUser(User user);
}

メソッドのインタフェース制限次のように:

  • ダーツは、メソッドのオーバーロードをサポートしていないので、同じ名前がインターフェイスメソッドには表示されないように
  • パラメータは、コールバックをサポートしていない、エンティティクラスをサポートしています
  • JSONデコードの制限により、Javaは引数なしのコンストラクタが必要です

2、Androidのメーカーは、同期をクリックするか、または実行します。

./gradlew assembleDebug

次のようにそれはJSONファイルの束を持っています。

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

これらのJSONファイルは記述ファイルFIDLとクラスです。はい、それはまた、参照性別クラス・プロファイルのユーザーを生成します

それと同時に、またIUserService実装IUserServiceStubを生成します。すなわち:

  • com.infiniteloop.fidl_example.IUserService.fidl.json
  • com.infiniteloop.fidl_example.User.json
  • com.infiniteloop.fidl_example.Gender.json
  • com.infiniteloop.fidl_example.IUserServiceStub.java

制限:インターフェイスはFIDL強い参照ではない場合にのみサブクラス参照FIDL強いクラスインターフェース、参照FIDLファイルとの間の強力な関係を生成するには、対応するプロファイルが生成されません。

3は、チャネルが正しい場所で開かれ、この方法は、フラッターを開示しました

IUserServiceStub userService = new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), userService);

図4は、必要に応じて、チャネルが適切な場合に閉じることができます

FidlChannel.closeChannel(userService);

通知メッセージフラッタ側に近接しています。

フラッター側

1、あなたのプロジェクトにフラッター、LIBディレクトリにFIDLディレクトリを作成し、このディレクトリに上記のJSONファイルをコピーして実行します。

flutter packages pub run fidl_model

その後、ダーツFIDLディレクトリに基づいて自動的に生成することができます。

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

すなわち:

  • User.dart
  • Gender.dart
  • IUserService.dart

2、Androidの結合側通路IUserServiceStub

bool connected = await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

_channelConnection接続状況追跡IUserServiceチャネル、チャネルの接続が成功した場合、それがメソッドをコールバックしますがonConnected、チャネルが切断された場合、それはonDisconnectedコールバックメソッドであろう。

3、通話チャネルの方法が開示されています

if (_channelConnection.connected) {
  await IUserService.initUser(User());
}

</>

4.このチャンネルを使用するには、不要になった場合、あなたがバインド解除することができます

await Fidl.unbindChannel(IUserService.CHANNEL_NAME, _channelConnection);

もちろん、FIDL機能以上より

図1に示すように、インターフェースの複数のパラメータFIDL

void init(String name, Integer age, Gender gender, Conversation conversation);

インターフェースの戻り値を持つ2、FIDL

UserInfo getUserInfo();

3、ジェネリッククラスの生成をサポート

public class User<T> {
  T country;
}
public class AUser<String>{}

FIDLインタフェース:

void initUser(AUser user);

ユーザーが生成することができますし、AUSERサイドダーツクラスは、継承を維持することができます。

4、列挙転送

void initEnum0(EmptyEnum e);
String initEnum1(MessageStatus status);

5、コレクション、地図を渡します

void initList0(List<String> ids);
void initList1(Collection<String> ids);
void initList7(Stack<String> ids);
void initList10(BlockingQueue ids);

図6は、複雑なオブジェクトを転送します。ダースaに継承、抽象的、ジェネリック、列挙型、および混合クラス。

さて、FIDLはダート側のアンドロイド側からのメソッド呼び出しを実現するだけ突出しています。以下のことをやるべき仕事があります:

  • Androidのサイド側のメソッドは、ダーツを呼び出します
  • それぞれ他のプラットフォームとフラッターメソッドを呼び出します
  • EventChannelは、のEventChannelは、本質的にMethodChannel、問題なしで達成されます

オブジェクトの送信を取得し、これらの問題は、小さなケースの友人です。

オブジェクトのシリアライズとデシリアライズのために

私は、Java側で持っているとフラッター側はインターフェイスクラスのシリアライズ/デシリアライズを定義することをカスタマイズ要件の大物を満たすために。

Java:
public interface ObjectCodec {
    List<byte[]> encode(Object... objects);
    <T> T decode(byte[] input, TypeLiteral<T> type);
}
Dart:
abstract class ObjectCodec {
  dynamic decode(Uint8List input);
  List<Uint8List> encode(List objects);
}

現在JsonObjectCodecを使用して、JSONは、符号化及び復号化を介して、性能が幾分少ないであろう。リアと小さなパートナーはまた、より効率的なコーデックを達成するために一緒に仕事をしたいです。

プロジェクトスケジュール

上記機能は、限りの方法は、関連側フラッタのJava側から呼び出されるように、大部分が達成されました。

私は、IM(インスタントメッセージング)SDK、メッセージ、シーンのメッセージを取得するためのチャットフラッター側のニーズのシミュレートされたAndroidの側に依存して、デモを行いました。以下は、デモのスクリーンショットです:

1、ホーム・ページ、ボタンのクリックは、Android側のメソッドを呼び出し、チャットサービスを開きます

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

2、チャットページ

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

3、メッセージおよび取得とルーシールーシーチャットを送信します

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

4、呼び出し側のAndroid Nウィルソンチャットにメッセージや取得を送信する方法

覚えていますか? それらの年で、我々は(:フラッターコミュニティAIDL FIDL)に追いつきました

あなたがこの記事を気に入った場合、物品は、容易ではない、またはあなたは、私たちが助けるという希望をたくさん持って親指をアップし、前方に、心配 ああ。記事は、継続的に更新されます。絶対に乾燥!

おすすめ

転載: blog.51cto.com/14775360/2485685