Pembangunan Aplikasi Mudah Alih Flutter · Pelajaran

Menulis Pemalam Platform Tersuai untuk iOS dan Android

Tulis pemalam bersekutu yang mendedahkan API Kotlin dan Swift asli kepada Dart.

Pelajaran 3 daripada 413 langkah

Menulis Pemalam Platform Tersuai untuk iOS dan Android ialah pelajaran Pembangunan Aplikasi Mudah Alih Flutter percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pembangunan Aplikasi Mudah Alih Flutter, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pembangunan Aplikasi Mudah Alih Flutter merangkumi sejumlah 4 pelajaran.

Mengapa Pemalam Platform?

Dart tidak boleh memanggil API iOS atau Android asli secara terus. Pemalam platform merapatkan jurang itu dengan mendedahkan keupayaan Swift/Objective-C dan Kotlin/Java kepada kod Dart anda melalui saluran bertip.

  • Pakej: Dart tulen, tanpa kod asli.
  • Pemalam: API Dart berserta pelaksanaan asli khusus platform.

Anda menulis pemalam apabila memerlukan perkakasan (penderia, BLE), perkhidmatan OS (pemberitahuan, rantai kunci), atau SDK asli yang tiada padanan Dart. Dalam pelajaran ini, kami menghasilkan pemalam bersekutu yang mendedahkan API Kotlin dan Swift asli kepada Dart.

Seni Bina Pemalam Bersekutu

Pemalam bersekutu membahagikan tanggungjawab merentas beberapa pakej supaya pihak yang berbeza boleh memiliki platform yang berbeza:

  • pakej menghadap aplikasi (battery): API Dart awam yang diimport oleh pembangun.
  • antaramuka platform (battery_platform_interface): kontrak abstrak yang mesti dipenuhi oleh semua pelaksanaan.
  • pakej platform (battery_android, battery_ios): pelaksanaan asli konkrit yang didaftarkan melalui pubspec.yaml.

Pemisahan ini membolehkan pihak ketiga menambah, contohnya, pelaksanaan Windows tanpa menyentuh pakej menghadap aplikasi. Pakej antaramuka ialah kontrak terasnya.

Kontrak Antaramuka Platform

Antaramuka platform menggunakan pakej plugin_platform_interface. Ia mengisytiharkan kelas asas abstrak dengan kontrak tanpa MethodChannel, serta tika lalai yang boleh ditindih oleh pakej lain.

Pengesahan token PlatformInterface menghalang pelaksana daripada menggunakan extends dan merosakkan kontrak; mereka mesti menggunakan implements yang dilindungi oleh verifyToken.

import 'package:plugin_platform_interface/plugin_platform_interface.dart';

abstract class BatteryPlatform extends PlatformInterface {
  BatteryPlatform() : super(token: _token);

  static final Object _token = Object();
  static BatteryPlatform _instance = MethodChannelBattery();

  static BatteryPlatform get instance => _instance;

  static set instance(BatteryPlatform value) {
    PlatformInterface.verifyToken(value, _token);
    _instance = value;
  }

  Future<int> getBatteryLevel() {
    throw UnimplementedError('getBatteryLevel() is not implemented.');
  }
}

MethodChannel: Pelaksanaan Lalai

Pelaksanaan lalai berkomunikasi dengan kod asli melalui MethodChannel. Setiap saluran mempunyai nama unik yang dikongsi oleh pihak Dart dan asli. invokeMethod menyiri argumen menggunakan pengekod mesej standard dan menunggu balasan asli.

Kekalkan nama saluran dalam ruang nama (DNS terbalik) untuk mengelakkan perlanggaran antara pemalam.

import 'package:flutter/services.dart';
import 'battery_platform_interface.dart';

class MethodChannelBattery extends BatteryPlatform {
  final MethodChannel _channel =
      const MethodChannel('com.example.battery/methods');

  @override
  Future<int> getBatteryLevel() async {
    final level = await _channel.invokeMethod<int>('getBatteryLevel');
    if (level == null) {
      throw PlatformException(code: 'NO_LEVEL', message: 'Level unavailable');
    }
    return level;
  }
}

Android: Pendaftaran Pemalam Kotlin

Di Android, pihak asli melaksanakan FlutterPlugin dan MethodChannel.MethodCallHandler. Dalam onAttachedToEngine, anda menyambungkan MethodChannel dengan nama yang sama seperti yang digunakan dalam Dart, kemudian menghalakan panggilan masuk dalam onMethodCall.

  • result.success(value) menyelesaikan Future Dart.
  • result.error(code, msg, details) melemparkan PlatformException dalam Dart.
  • result.notImplemented() menandakan kaedah yang tidak diketahui.

Ini ialah Kotlin, bukannya Dart, jadi ia hanya untuk tujuan ilustrasi.

iOS: Pendaftaran Pemalam Swift

Di iOS, anda mematuhi FlutterPlugin dan mendaftar dalam register(with:), dengan mencipta FlutterMethodChannel yang mempunyai nama sepadan. handle(_:result:) mengagihkan panggilan dan memberikan balasan melalui panggilan balik FlutterResult.

Untuk pemalam bersekutu, pakej platform mengisytiharkan titik masuk aslinya di bawah flutter.plugin.platforms.ios dalam pubspec.yaml, yang menunjuk kepada kelas Swift. Pendaftar Dart disambungkan secara automatik.

Mengisytiharkan pubspec Bersekutu

Pakej pelaksanaan platform mengumumkan kewujudannya melalui flutter.plugin.platforms. dartPluginClass didaftarkan dengan antaramuka platform semasa permulaan, manakala pluginClass menamakan kelas asli.

Yang penting, pakej menghadap aplikasi menyenaraikan setiap pakej platform di bawah default_package, jadi penambahan platform ialah perubahan pubspec, bukannya perubahan kod.

Menyokong Pelaksanaan Platform

Pakej menghadap aplikasi menyokong pelaksanaan dengan bergantung padanya dalam pubspec.yaml. Pakej yang disokong ditarik masuk secara transitif, jadi pembangun aplikasi hanya menambah satu kebergantungan dan memperoleh semua platform.

Pada masa jalan, registerWith() setiap pakej platform menetapkan instance antaramuka kepada pelaksanaannya sendiri. API Dart kemudiannya memanggil melalui BatteryPlatform.instance tanpa mengetahui platform yang memberikan jawapan.

// battery_android registers itself at startup
import 'battery_platform_interface.dart';

class BatteryAndroid extends BatteryPlatform {
  /// Registered via dartPluginClass in pubspec.yaml.
  static void registerWith() {
    BatteryPlatform.instance = BatteryAndroid();
  }

  @override
  Future<int> getBatteryLevel() {
    // Delegates to the MethodChannel under the hood.
    return MethodChannelBattery().getBatteryLevel();
  }
}

API Dart Menghadap Aplikasi

Pakej awam membungkus antaramuka dalam API yang mudah digunakan dan didokumentasikan dengan baik. Pembangun aplikasi tidak perlu menyentuh saluran atau kelas platform — mereka hanya memanggil kaedah Dart yang kemas.

Pastikan lapisan ini nipis: pengesahan, lebihan kemudahan dan dokumentasi. Semua kerja sebenar berada di sebalik BatteryPlatform.instance.

import 'battery_platform_interface.dart';

class Battery {
  /// Returns the current battery level as a percentage (0-100).
  Future<int> get batteryLevel => BatteryPlatform.instance.getBatteryLevel();

  /// Convenience: true when the device is critically low.
  Future<bool> get isCritical async => (await batteryLevel) <= 15;
}

Menstrim Peristiwa Asli dengan EventChannel

Untuk data berterusan (keadaan pengecasan, strim penderia), satu panggilan kaedah tidak mencukupi. Gunakan EventChannel: pihak asli menolak peristiwa melalui StreamHandler/FlutterEventSink, manakala Dart mendedahkannya sebagai Stream.

receiveBroadcastStream memulakan pendengar asli secara malas apabila langganan pertama dibuat dan menghentikannya apabila langganan dibatalkan.

import 'package:flutter/services.dart';

class BatteryStream {
  final EventChannel _events =
      const EventChannel('com.example.battery/charging');

  Stream<bool> get onChargingChanged => _events
      .receiveBroadcastStream()
      .map((event) => event == 'charging');
}

Saluran Bertip Selamat dengan Pigeon

Saluran yang ditulis tangan menggunakan jenis berasaskan rentetan dan mudah terdedah kepada ralat. Pigeon menjana pengikatan Dart, Kotlin dan Swift yang bertip selamat daripada satu fail definisi Dart, sekali gus menghapuskan kesilapan taip nama kaedah dan ketidakpadanan pengekod.

Anda menganotasi kelas abstrak dengan @HostApi() (Dart memanggil asli) atau @FlutterApi() (asli memanggil Dart), menjalankan penjana Pigeon dan menyambungkan kelas yang dijana — tiada rentetan invokeMethod manual.

import 'package:pigeon/pigeon.dart';

class BatteryInfo {
  int? level;
  bool? isCharging;
}

@HostApi()
abstract class BatteryHostApi {
  BatteryInfo getBatteryInfo();
}

@FlutterApi()
abstract class BatteryFlutterApi {
  void onLevelChanged(int level);
}

Semakan Pantas

Anda sedang menerbitkan pemalam Flutter dan mahu pihak ketiga menambah pelaksanaan platform baharu (contohnya Windows) tanpa mengubah suai atau mencabang pakej menghadap aplikasi anda. Seni bina dan mekanisme manakah yang membolehkan perkara ini?

Imbas Kembali

Anda telah mempelajari cara menghasilkan pemalam platform bersekutu yang mendedahkan API Kotlin dan Swift asli kepada Dart:

  • Seni bina: pakej menghadap aplikasi, antaramuka platform dan pelaksanaan bagi setiap platform.
  • Kontrak: PlatformInterface abstrak dengan pengesahan token dan instance yang boleh ditukar.
  • Saluran: MethodChannel untuk permintaan/balasan, EventChannel untuk strim peristiwa asli, dengan nama yang sepadan pada kedua-dua pihak.
  • Pihak asli: onMethodCall Kotlin dan handle(_:result:) Swift yang menyelesaikan melalui kejayaan/ralat.
  • Sokongan: pubspec menyambungkan dartPluginClass dan pluginClass supaya platform mendaftarkan dirinya.
  • Pigeon: menjana pengikatan bertip selamat untuk menggantikan saluran berasaskan rentetan yang rapuh.

Dengan ini, anda boleh membungkus mana-mana SDK asli di sebalik API Dart yang kemas dan boleh diuji.

Percuma untuk bermula

Pelajari Dart dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Menulis Pemalam Platform Tersuai untuk iOS dan Android” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Pembangunan Aplikasi Mudah Alih Flutter, termasuk “Menulis Pemalam Platform Tersuai untuk iOS dan Android”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Pembangunan Aplikasi Mudah Alih Flutter merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menulis Pemalam Platform Tersuai untuk iOS dan Android”?

Tulis pemalam bersekutu yang mendedahkan API Kotlin dan Swift asli kepada Dart. Anda berlatih Pembangunan Aplikasi Mudah Alih Flutter menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pembangunan Aplikasi Mudah Alih Flutter?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pembangunan Aplikasi Mudah Alih Flutter di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Menulis Pemalam Platform Tersuai untuk iOS dan Android” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pembangunan Aplikasi Mudah Alih Flutter ini?

Ya. Setiap pelajaran Pembangunan Aplikasi Mudah Alih Flutter menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Memanggil Pustaka C dengan dart:ffi
  2. Saluran Platform Selamat Jenis dengan Pigeon
  3. Menulis Pemalam Platform Tersuai untuk iOS dan Android
  4. Isolat Latar Belakang dan Pengurusan Memori Asli
← Kembali ke Pembangunan Aplikasi Mudah Alih Flutter