Erinnern Sie sich? In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Vorwort

Hallo an alle! Heute denke ich, dass Amway ein relativ schweres Flutter von Open-Source-Projekten.

Flutter Produktdefinition ist eine leistungsstarkes Mobil UI - Framework Cross-Plattform kann mit einem Satz von Code während Android / iOS / Web / MacOS - Anwendungen aufgebaut werden. Als UI - Framework , hat es nicht einige der Schnittstellen des Systems, kann nicht umhin , mit natürlichen oder nativen Umgang. Seitdem stellt sie so genannte Plattform Kanal für Flattern und nativen flexiblen Austausch von Daten. Zur Vereinfachung der Beschreibung bezieht er sich auf eine native Android Generationen.

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Brennende Gans, Gans, Brenn - Gans , es unterstützt nur die Übertragung von einigen der grundlegenden Datentypen und Datenstrukturen, zum Beispiel Bool / int / long / Byte / Zeichen / String / byte [] / Liste / Map wie.

Daher, wenn Sie komplexe Datenpunkte übertragen möchten, können Sie nur Karte verpackt, wie folgt aus:

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

Dann wird die Android-Schicht hart Code, analysiert verschiedene Daten auf den Schlüssel entspricht. Wenn Sie zu einem reinen fluter Projekt gehen, und später gibt es kein Abkommen und die native oder braucht nur eine einfache Interaktion, dass dieser Ansatz ist verständlich. Und wenn Ihr Projekt ein großer Teil des nativen Codes wird, oder wenn Sie einen Dritten verwenden, müssen nicht das Flattern der lib Bibliothek nicht unterstützt, es bedeutet, dass Sie eine Menge Code als Vorlage schreiben, um oben. Visible ineffizient und Wartbarkeit. An diesem Punkt werden Sie wollen Transferobjekte der Lage sein, wie!

Und wenn Sie möchten, Transferobjekte:

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Sorry, keine Möglichkeit, können Sie nur geben eine peinliche Krise sind nicht höfliches Lächeln. Natürlich noch nicht, wir Sequenz in die obere Hauptaufgabe json, json und biegen dann in die Objektschicht in dem flattern flattern ausrichten können, ist die gleiche Effizienz schlecht.

Was ist FIDL

Android gelernt sollte AIDL (Android-Schnittstelle Defination Language), nämlich Android Interface Definition Language kennen. Android gibt es ein hohes Maß an Interprozesskommunikation --Binder, wollen aber Binder Notwendigkeit verwenden, einige der Mechanismen und API Binder zu verstehen, müssen Sie eine Menge Standardcode zu schreiben. Android Um dieses Problem zu lösen, versuchen weißen Binder Art und Weise zu verwenden, es zu tun. So definiert AIDL, die Entwickler sagen, müssen Sie eine Schnittstelle zu Write-Datei nach meinen Anforderungen, müssen Sie das Objekt durchqueren muss der Übertragungsprozess Parcel Schnittstelle implementieren. Dann Android gibt Ihnen eine Service.Stub Klasse erzeugen, heimlich hinter dem Objekt Serialisierung, Deserialisierung gab Arbeit zu tun. Entwickler die Verwendung dieser Klasse wird leicht Stub Binder loszulegen Diese High-Level-prozessübergreifende Kommunikationsmethoden können. (Ich habe, hey)

FIDL (Flutter Schnittstelle Defination Language) Schnittstellen-Definitionssprache, die ist Flutter, seine Mission und AIDL sehr ähnlich, ruhig Objektserialisierung, Deserialisierung, automatische Code-Generierung solchen „schmutzige Arbeit“ zu tun. Entwickler gesehen in nativen Code-Klasse, durch @FIDL Annotation Tag, automatisch die gleiche Seite des Dart und nativen Code-Klasse zu erzeugen. FIDL ist ein Spiegel, die Dart auf die native Plattform abgebildet verschiedenen Klassen in den Dart-Klassen auf dem jeweiligen nativen Internet abgebildet.

Weniger langatmig, Blick auf die Dinge

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Die erste ist die Java-Klasse:

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

Android Seite

1 ist die Schnittstelle definiert FIDL

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

2, Run ./gradlew assembleDebug, IUserServiceStub Erzeugungsklassendateien und fidl.json

3, um den Kanal zu öffnen, wird das Verfahren offenbart, Flutter

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

Flutter Seite

1, wird die Datei fidl.json Fidl Verzeichnis zu kopieren, Run flattern Pakete pub Lauf fidl_model, Interface-Klasse erzeugt Dart

2, Android Bindungsseitendurchgang IUserServiceStub

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

3, rufen die Verfahren der öffentlichen

await IUserService.initUser(User());

Kompilieren und ausführen, können Sie in Logcat sehen, die Oscar ist 18 Jahre alt!.

FIDL Anwendungen detailliert

Dieser Teil ist ein wenig langatmig, Blick auf welchem ​​Teil der zusätzlichen Erklärungen kann das Publikum besitzen Großvater übersprungen.

Im obigen Beispiel der Karte, in der Regel wird auf eine Klasse in Java entspricht sein:

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

Wenn Sie ohne das Flattern Schicht manuell Schreibbenutzerklasse flattern Übertragung dieses Objekt werden soll, und schreiben fromJson / toJson Methode können Sie dies tun:

Android Seite

1, definieren eine Schnittstelle, Hinzufügen Anmerkungen @FIDL. Diese Anmerkung wird annotationProcessor Schnittstellen informieren und eine Art von Beschreibungsdateien erzeugen.

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

Restriktionsschnittstellenverfahren wie folgt:

  • Da die Dart, nicht Methode Überlastung unterstützen, so kann der gleiche Name nicht in der Interface-Methode erscheinen
  • Parameter unterstützt nur Klassen Einheit, nicht unterstützen Rückrufe
  • Aufgrund der Beschränkungen von JSON-Decodierung, erfordert Java Konstruktor ohne Argumente

2, Android Studio Klick synchronisieren oder ausführen:

./gradlew assembleDebug

Dann wird es eine Reihe von Json-Datei wie folgt:

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Diese JSON - Datei ist die Beschreibungsdatei FIDL und Klassen. Ja, es wird auch Geschlecht Klassenprofil Benutzer verwiesen erzeugen .

Zugleich erzeugt auch IUserService Implementierung IUserServiceStub. nämlich:

  • 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

Einschränkungen: nur eine starke Beziehung zwischen der Referenz FIDL Datei erzeugen, den referenzierten Unterklasse FIDL strong class-Schnittstellen, wenn die Schnittstelle nicht FIDL starke Referenz, wird entsprechendes Profil nicht erzeugt.

3, wobei der Kanal an der richtigen Stelle geöffnet wird, das offenbarte Verfahren Flutter

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, falls erforderlich, kann der Kanal geschlossen wird gegebenenfalls

FidlChannel.closeChannel(userService);

Nah an der Benachrichtigungsnachricht Flutter Seite.

Flutter Seite

1, das Flattern in Ihre Projekte, erstellen Fidl Verzeichnis im Verzeichnis lib, kopieren Sie die oben JSON-Datei in dieses Verzeichnis und führen:

flutter packages pub run fidl_model

Es kann dann automatisch basierend erzeugt wird auf dem Dart Fidl Verzeichnis:

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

nämlich:

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

2, Android Bindungsseitendurchgang IUserServiceStub

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

_channelConnection Verbindungsstatusverfolgung IUserService Kanal, wenn die Kanal-Verbindung erfolgreich ist, wird es Method Callback onConnected, wenn der Kanal getrennt ist, wird es onDisconnected Callback-Methode.

3, wird ein Verfahren der Anrufkanäle offen

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

</>

4. Wenn Sie nicht mehr benötigen, diesen Kanal zu verwenden, können Sie unbind

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

Natürlich Funktion FIDL mehr als das

1 ist eine Vielzahl von Parametern der Schnittstelle FIDL

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

2, mit einem Rückgabewert der Schnittstellen FIDL

UserInfo getUserInfo();

3, unterstützen die Erzeugung von generischen Klasse

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

FIDL Schnittstelle:

void initUser(AUser user);

Benutzer werden in der Lage sein, zu generieren und Auser Seiten dart Klassen, können die Vererbung erhalten.

4, Aufzählungsübertragungs

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

5, vorbei an der Sammlung, Karte

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

6, komplexe Objekte übertragen. Vererbung, abstrakt, Generika, Aufzählungen und gemischte Klassen zu einem Dutzend ein.

Nun projizieren FIDL nur den Methodenaufruf aus der Android Seite der Dart Seite zu realisieren. Es gibt Arbeit folgendes zu tun:

  • Android Seite Seite Methode ruft Dart
  • Rufen Sie die jeweils andere Plattformen und Flutter Methoden
  • EventChannel, die EventChannel im Wesentlichen durch MethodChannel erreicht werden, kein Problem

Holen Objektübertragung, sind diese Probleme kleinen Fall Freunde.

Für die Serialisierung und Deserialisierung der Objekte

Um die Bonzen von Anpassungsanforderungen gerecht zu werden, dass ich in Java Seite und Flutter Seite definiert die Serialisierung / Deserialisierung der Interface-Klasse.

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);
}

Derzeit JsonObjectCodec Verwendung durch JSON Codieren und Decodieren wird die Leistung etwas geringer. Heck- und kleine Partner wollen auch zusammen arbeiten, um eine effizientere Codecs zu erreichen.

Projektplan

Die oben genannten Funktionen, solange das Verfahren von der Java-Seite der zugehörigen Seiten Flutter aufgerufen wird, die meisten sind erreicht worden.

Ich habe eine Demo, stützt sich auf eine simulierte Android Seite des IM (Instant Messaging) SDK, Chat Flutter Seite Notwendigkeit, die Nachricht zu erhalten, wird eine Meldung der Szene. Das Folgende ist eine Demo-Screenshot:

1, die Homepage, klicken Sie auf die Schaltfläche ruft die Android Seite Methode, öffnen Sie den Chat-Dienst

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

2, Chat-Seite

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

3, eine Nachricht und akquiriert und Lucy Lucy Chats schicken

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

4, ein Verfahren zur Übertragung rufenden Seite Android N Wilson Nachrichten und akquiriert chatten

Erinnern Sie sich?  In diesen Jahren fingen wir oben mit (FIDL: Flutter Gemeinde AIDL)

Der Artikel ist nicht einfach, wenn Sie diesen Artikel gefallen hat, oder Sie haben viel Hoffnung , dass wir helfen, den Daumen nach oben, nach vorne, Sorge  oh. Artikel wird ständig aktualisiert. Absolut trocken! ! !

Ich denke du magst

Origin blog.51cto.com/14775360/2485685
Empfohlen
Rangfolge