Flutter与iOS原生如何通讯

在Flutter中与iOS原生进行通讯通常使用Platform Channels。Platform Channels允许Flutter与原生代码之间进行双向通信。以下是一个简单的Flutter与iOS原生通讯的示例。

首先,在Flutter中创建一个通道,例如MethodChannel,并定义一些方法用于与iOS原生进行通信。然后,在iOS原生代码中实现这些方法。下面是一个简单的示例:

Flutter 代码:

js 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = const MethodChannel('com.example.flutter_ios_demo/channel');

  Future<void> _sendMessageToNative() async {
    try {
      await platform.invokeMethod('sendMessageToNative', {'message': 'Hello from Flutter!'});
    } on PlatformException catch (e) {
      print("Failed to send message to native: ${e.message}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter iOS Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _sendMessageToNative,
            child: Text('Send Message to Native'),
          ),
        ),
      ),
    );
  }
}

iOS 代码:

js 复制代码
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 channel = FlutterMethodChannel(name: "com.example.flutter_ios_demo/channel", binaryMessenger: controller.binaryMessenger)
    
    channel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
      if call.method == "sendMessageToNative" {
        if let arguments = call.arguments as? Dictionary<String, Any>,
           let message = arguments["message"] as? String {
          self.receiveMessageFromFlutter(message: message)
          result(nil)
        } else {
          result(FlutterError(code: "INVALID_ARGUMENTS", message: "Invalid arguments", details: nil))
        }
      } else {
        result(FlutterMethodNotImplemented)
      }
    })

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  func receiveMessageFromFlutter(message: String) {
    print("Received message from Flutter: \(message)")
    // Handle the received message from Flutter in your native iOS code
  }
}

在上述示例中,我们使用了MethodChannel来建立Flutter和iOS原生之间的通信通道。Flutter通过invokeMethod发送消息给原生,原生通过设置setMethodCallHandler来接收来自Flutter的消息,并执行相应的处理。

确保在你的pubspec.yaml文件中添加了flutter/services依赖。

这只是一个简单的示例,实际的应用可能涉及更多的交互和数据传输。请注意,这里的通信是单向的,如果需要双向通信,你可能需要使用EventChannel等其他通道类型。

相关推荐
AC赳赳老秦3 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
谢慧琼3 小时前
2026零基础做企业网站,低成本搭建官方网站
服务器·前端·javascript
weixin_431600444 小时前
前端数据埋点(1):一次点击如何变成一条埋点
前端·js·数据埋点
IT_陈寒4 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
计算机魔术师4 小时前
同样是AI辅助建造,为什么有的游戏三个月就烂尾了?
前端
用户921080262865 小时前
0. 做 Agent 产品,前端 AI 组件框架怎么选?
前端
拾年2756 小时前
React Hooks 进阶篇:useMemo / useCallback / useReducer / useImperativeHandle,用「算账 +
前端·javascript·react.js
Jackson__6 小时前
面试官:如何在老项目中使用新框架,并实现通信?
前端·javascript·面试
拾年2756 小时前
React Hooks 保姆级教程:把组件想象成失忆的打工人,4 个 Hook 带你原地起飞
前端·javascript·react.js
mmsx6 小时前
一个 Bug 修了 12 轮,根因只有一句话:AI 编程时代,日志才是唯一的真相
前端