Saluran Platform (MethodChannel)
Berkomunikasi dengan kod Android asli (Kotlin/Java) dan iOS asli (Swift/Objective-C) menggunakan Saluran Platform untuk ciri khusus platform.
Saluran Platform (MethodChannel) ialah pelajaran Pembangunan Aplikasi Mudah Alih Flutter percuma di CoddyKit. Ini ialah pelajaran 1 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.
Saluran Platform: Menjambatani Kod Asli
Selamat datang ke Saluran Platform! Kadangkala, aplikasi Flutter Anda perlu mengakses ciri khusus platform mudah alih asas (Android atau iOS) yang tidak tersedia secara langsung dalam Flutter atau Dart.
Di sinilah Saluran Platform digunakan. Saluran ini bertindak sebagai jambatan yang membolehkan kod Dart Anda berkomunikasi dengan kod asli yang ditulis dalam Kotlin/Java untuk Android atau Swift/Objective-C untuk iOS.
Cara MethodChannel Berfungsi
Saluran Platform menggunakan sistem bernama MethodChannel untuk menghantar mesej antara Flutter dan platform asli. Anggaplah ia sebagai jalan dua hala:
- Flutter menghantar panggilan kaedah ke bahagian asli.
- Kod asli melaksanakan kaedah tersebut dan menghantar hasilnya kembali kepada Flutter.
Mesej dihantar secara tak segerak bagi memastikan UI Anda kekal responsif.
Flutter: Mencipta MethodChannel
Di bahagian Flutter (Dart), anda mencipta satu tika MethodChannel. Kuncinya ialah menggunakan pengecam rentetan yang unik, yang sering dipanggil “nama saluran”, dan mestilah sama pada bahagian Flutter serta natif.
Mari sediakan saluran untuk mendapatkan maklumat peranti:
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
// Define the MethodChannel with a unique name
static const platform = MethodChannel('com.example.app/device');
String _deviceModel = 'Unknown';
Future<void> _getDeviceModel() async {
// Implementation to invoke native method will be added
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Platform Channel Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Device Model: $_deviceModel'),
ElevatedButton(
onPressed: _getDeviceModel,
child: Text('Get Device Model'),
),
],
),
),
);
}
}
void main() {
runApp(MaterialApp(home: HomePage()));
}Flutter: Memanggil Kaedah Natif
Untuk memanggil kaedah natif, gunakan platform.invokeMethod(). Panggilan ini tidak segerak dan mengembalikan Future. Anda perlu menunggu hasilnya untuk mendapatkan data daripada bahagian natif.
Mari kemas kini kaedah _getDeviceModel kita:
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
static const platform = MethodChannel('com.example.app/device');
String _deviceModel = 'Unknown';
Future<void> _getDeviceModel() async {
String deviceModel;
try {
// Invoking the native method 'getDeviceModel'
final String result = await platform.invokeMethod('getDeviceModel');
deviceModel = result; // The result from native is a String
} on PlatformException catch (e) {
// Catch errors sent back from the native side
deviceModel = "Failed to get model: '${e.message}'.";
}
setState(() {
_deviceModel = deviceModel;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Platform Channel Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Device Model: $_deviceModel'),
ElevatedButton(
onPressed: _getDeviceModel,
child: Text('Get Device Model'),
),
],
),
),
);
}
}
void main() {
runApp(MaterialApp(home: HomePage()));
}Flutter: Menghantar Data kepada Natif
Anda juga boleh menghantar argumen kepada kaedah natif. Argumen ini dihantar sebagai Map, yang membolehkan anda menyertakan pelbagai jenis data.
Mari cipta kaedah baharu untuk mendapatkan model peranti “tersuai” dengan awalan dan akhiran:
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
static const platform = MethodChannel('com.example.app/device');
String _customModel = 'Unknown';
Future<void> _getCustomModel(String prefix) async {
String customModel;
try {
// Invoking with arguments: a Map
final String result = await platform.invokeMethod(
'getCustomModel',
{'prefix': prefix, 'suffix': 'v1'}
);
customModel = result;
} on PlatformException catch (e) {
customModel = "Failed to get custom model: '${e.message}'.";
}
setState(() {
_customModel = customModel;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Platform Channel Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Custom Model: $_customModel'),
ElevatedButton(
onPressed: () => _getCustomModel('MyApp'),
child: Text('Get Custom Model'),
),
],
),
),
);
}
}
void main() {
runApp(MaterialApp(home: HomePage()));
}Android (Kotlin): Menyediakan Saluran
Di bahagian Android, anda akan menyediakan MethodChannel dalam fail MainActivity.kt. Di sinilah anda menentukan cara mengendalikan panggilan kaedah yang masuk daripada Flutter.
Pastikan nama saluran anda sepadan dengan nama dalam kod Flutter.
package com.example.coddy_app
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.app/device"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
// This block will execute when Flutter invokes a method
call, result ->
// Logic to handle 'call' and respond using 'result'
}
}
}Android (Kotlin): Mengendalikan Panggilan
Di dalam setMethodCallHandler, anda menyemak rentetan call.method untuk mengenal pasti kaedah yang cuba dipanggil oleh Flutter. Anda juga boleh mengakses argumen menggunakan call.argument().
Gunakan result.success() untuk menghantar data kembali atau result.notImplemented() jika kaedah tersebut tidak dikendalikan.
package com.example.coddy_app
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.os.Build // Import for device info
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.app/device"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getDeviceModel") {
val model = Build.MODEL // Get device model
result.success(model) // Return success to Flutter
} else if (call.method == "getCustomModel") {
val prefix = call.argument<String>("prefix") ?: ""
val suffix = call.argument<String>("suffix") ?: ""
val customModel = "$prefix-${Build.MODEL}-$suffix"
result.success(customModel)
}
else {
result.notImplemented() // Indicate method not found
}
}
}
}iOS (Swift): Menyediakan Saluran
Untuk iOS, anda biasanya mengkonfigurasi MethodChannel dalam fail AppDelegate.swift. Seperti Android, nama saluran mestilah sepadan dengan nama di bahagian Flutter.
Penyediaan ini melibatkan mendapatkan FlutterViewController dan mencipta FlutterMethodChannel.
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let deviceChannel = FlutterMethodChannel(name: "com.example.app/device",
binaryMessenger: controller.binaryMessenger)
deviceChannel.setMethodCallHandler({ // Set up handler for incoming calls
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
// Logic to handle 'call' and respond using 'result'
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}iOS (Swift): Mengendalikan Panggilan
Dalam Swift, anda menggunakan pernyataan switch atau if/else if untuk menyemak call.method. Argumen diakses melalui call.arguments, yang biasanya merupakan kamus [String: Any].
Gunakan result() bersama nilai untuk kejayaan atau FlutterMethodNotImplemented bagi kaedah yang tidak dikendalikan.
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let deviceChannel = FlutterMethodChannel(name: "com.example.app/device",
binaryMessenger: controller.binaryMessenger)
deviceChannel.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
if call.method == "getDeviceModel" {
let model = UIDevice.current.model // Get device model
result(model) // Return success to Flutter
} else if call.method == "getCustomModel" {
if let args = call.arguments as? [String: Any],
let prefix = args["prefix"] as? String,
let suffix = args["suffix"] as? String {
let customModel = "\(prefix)-\(UIDevice.current.model)-\(suffix)"
result(customModel)
} else {
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Arguments missing or invalid", details: nil))
}
}
else {
result(FlutterMethodNotImplemented)
}
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}Mengendalikan Ralat Natif
Amat penting untuk mengendalikan ralat daripada bahagian natif dengan sewajarnya. Kod natif boleh menghantar ralat kembali menggunakan result.error() (Android) atau FlutterError() (iOS).
Flutter menangkapnya sebagai PlatformException, yang boleh anda kendalikan dalam blok try-on, seperti yang ditunjukkan dalam contoh pemanggilan Flutter kita.
package com.example.coddy_app
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.os.Build
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.app/device"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getCustomModel") {
val prefix = call.argument<String>("prefix")
if (prefix == null || prefix.isEmpty()) {
// Sending an error back to Flutter
result.error("MISSING_PREFIX", "Prefix argument is required.", null)
} else {
val suffix = call.argument<String>("suffix") ?: ""
val customModel = "$prefix-${Build.MODEL}-$suffix"
result.success(customModel)
}
}
// ... other methods
else { result.notImplemented() }
}
}
}Pemeriksaan Saluran Platform
Uji pemahaman anda tentang Saluran Platform Flutter.
Ulang Kaji: Merapatkan Jurang
Syabas! Anda telah mempelajari cara menggunakan Saluran Platform untuk memperluas keupayaan aplikasi Flutter dengan berinteraksi dengan ciri khusus platform natif.
- Anda mencipta
MethodChanneldalam Flutter dan pada setiap platform natif (Android/iOS). - Flutter menggunakan
invokeMethod()untuk memanggil fungsi natif. - Kod natif mengendalikan panggilan ini dan mengembalikan hasil atau ralat.
Teknik berkuasa ini memastikan aplikasi Flutter anda tidak pernah terhad oleh perkara yang disediakan secara langsung oleh rangka kerja!
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 “Saluran Platform (MethodChannel)” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Pembangunan Aplikasi Mudah Alih Flutter, termasuk “Saluran Platform (MethodChannel)”, 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 “Saluran Platform (MethodChannel)”?
Berkomunikasi dengan kod Android asli (Kotlin/Java) dan iOS asli (Swift/Objective-C) menggunakan Saluran Platform untuk ciri khusus platform. 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 1 daripada 4.
Berapa lamakah pelajaran “Saluran Platform (MethodChannel)” 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
- Saluran Platform (MethodChannel)
- Pemalam Geolokasi dan Kamera
- Integrasi UI Asli
- Kebenaran dan Penderia