温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Flutter如何与原生交互

发布时间:2026-09-01 04:04:04 来源:亿速云 阅读:99 作者:小樊 栏目:开发技术

在 Flutter 中,与原生(Android / iOS)交互主要通过 Platform Channel 实现。下面从原理、方式、示例几个层面说明。


一、核心机制:Platform Channel

Flutter 与原生不在同一线程、不同语言环境,通信通过 异步消息通道。

三种常用 Channel:

类型 用途
MethodChannel 一次性方法调用(最常用)
EventChannel 原生向 Flutter 持续发送事件(如传感器)
BasicMessageChannel 双向、结构化消息通信

二、MethodChannel(最常用)

1️⃣ Flutter 端

import 'package:flutter/services.dart';

const platform = MethodChannel('com.example/app');

Future<void> getBatteryLevel() async {
  try {
    final int result = await platform.invokeMethod('getBatteryLevel');
    print('电池电量: $result%');
  } on PlatformException catch (e) {
    print("失败: ${e.message}");
  }
}

2️⃣ Android 端(Kotlin)

import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(
            flutterEngine.dartExecutor.binaryMessenger,
            "com.example/app"
        ).setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val level = 80
                result.success(level)
            } else {
                result.notImplemented()
            }
        }
    }
}

3️⃣ iOS 端(Swift)

import Flutter

class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {

        let controller = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(
            name: "com.example/app",
            binaryMessenger: controller.binaryMessenger
        )

        channel.setMethodCallHandler { call, result in
            if call.method == "getBatteryLevel" {
                result(85)
            } else {
                result(FlutterMethodNotImplemented)
            }
        }

        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

三、原生调用 Flutter(反向通信)

platform.setMethodCallHandler((call) async {
  if (call.method == "fromNative") {
    print(call.arguments);
  }
});

原生调用:

channel.invokeMethod("fromNative", "Hello from Android")

四、EventChannel(持续事件)

适合:

  • 定位
  • 蓝牙
  • 传感器

Flutter

EventChannel('com.example/events')
    .receiveBroadcastStream()
    .listen((event) {
  print(event);
});

五、推荐方案(更现代)

✅ Pigeon(官方代码生成)

  • 类型安全
  • 少写样板代码
  • 支持 Method / Event
dev_dependencies:
  pigeon: ^x.x.x

六、常见使用场景

  • 调用系统 API(电量、蓝牙、通知)
  • 使用原生 SDK(微信、支付宝)
  • 性能敏感模块(音视频、图像处理)
  • 已有原生业务复用

如果你告诉我:

  • ✅ Android / iOS
  • ✅ 具体功能(如蓝牙、定位、支付)

我可以直接给你完整可运行示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手