Flutter平台对象通信插件platform_object_channel的使用

Flutter平台对象通信插件platform_object_channel的使用

pub package

platform_object_channel 是一个用于在平台对象实例和 Dart 对象实例之间创建通道的 Flutter 插件。

支持情况

Android iOS macOS
支持 SDK 19+ 13.0+ 10.15+

使用方法

要使用此插件,你需要在 pubspec.yaml 文件中添加 platform_object_channel 作为依赖项:

dependencies:
  platform_object_channel: ^版本号

示例

Dart 示例

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:platform_object_channel/platform_object_channel.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  dynamic _methodResult = 'Unknown';
  dynamic _streamMethodResult = 'Unknown';

  @override
  void initState() {
    super.initState();

    // 创建平台对象通道
    final platformObjectInstance = PlatformObjectChannel(
      Platform.isAndroid ? "com.example.example.TestObject" : "TestObject",
      "arguments"
    );

    // 设置方法调用处理器
    platformObjectInstance.setPlatformObjectMethodCallHandler(
      (method, arguments) async {
        if (method == "sayHi") {
          return "reply from flutter";
        }
      },
    );

    // 调用方法并获取结果
    Future(() async {
      _methodResult = await platformObjectInstance.invokeMethod("sayHi", "im flutter");
      setState(() {});
    });

    // 订阅流方法并处理结果
    Future(() async {
      await for (var element in platformObjectInstance.invokeMethodStream("sayHi_10", "im flutter, 10")) {
        setState(() {
          _streamMethodResult = element;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            Text("method result: $_methodResult"),
            Text("stream method result: $_streamMethodResult"),
          ],
        ),
      ),
    );
  }
}

iOS 和 macOS 示例

@objc(TestObject)
class TestObject : NSObject, FoundationPlatformObject {
    required init(_ flutterArgs: Any?, _ messager: FoundationPlatformObjectMessenger) {
        self.messager = messager
    }

    let messager: FoundationPlatformObjectMessenger

    // 处理方法调用
    func handleFlutterMethodCall(_ method: String, _ arguments: Any?) async -> Any? {
        Task {
            var result = await messager.invokeMethod("sayHi", "hi")
            print("flutter return \(result ?? "")")
        }
        return "Hi"
    }

    // 处理流方法调用
    func handleFlutterStreamMethodCall(_ method: String, _ arguments: Any?, _ sink: platform_object_channel_foundation.FoundationPlatformStreamMethodSink) {
        var count = 10
        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
            count -= 1
            if count <= 0 {
                timer.invalidate()
                sink.done()
            } else {
                sink.add("Hi \(count)")
            }
        }
    }

    // 释放资源
    func dispose() {
        // 释放资源
    }
}

Android 示例

class TestObject : AndroidPlatformObject {
    private lateinit var messager: AndroidPlatformObjectMessenger

    // 初始化
    override fun setUp(flutterArgs: Any?, messager: AndroidPlatformObjectMessenger) {
        this.messager = messager
    }

    // 处理方法调用
    override suspend fun handleFlutterMethodCall(method: String, arguments: Any?): Any? {
        GlobalScope.launch(Dispatchers.Default) {
            var result = messager.invokeMethod("sayHi", "hi")
            print("flutter return $result")
        }
        return "Hi"
    }

    // 处理流方法调用
    override fun handleFlutterStreamMethodCall(
        method: String,
        arguments: Any?,
        sink: AndroidPlatformStreamMethodSink
    ) {
        var count = 0
        GlobalScope.launch {
            while (true) {
                count++
                if (count > 10) {
                    sink.done()
                } else {
                    sink.add(count)
                }
                delay(1000)
            }
        }
    }

    // 释放资源
    override fun dispose() {
        // 释放资源
    }
}

更多关于Flutter平台对象通信插件platform_object_channel的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter平台对象通信插件platform_object_channel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


platform_object_channel 是一个用于在 Flutter 和原生平台(Android/iOS)之间进行对象通信的插件。它允许你在 Flutter 和原生代码之间传递复杂的对象,而不仅仅是基本数据类型。这在需要与原生平台进行深度交互的应用程序中非常有用。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 platform_object_channel 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  platform_object_channel: ^latest_version

然后运行 flutter pub get 来获取插件。

使用 PlatformObjectChannel

1. 创建 PlatformObjectChannel

在 Flutter 中,你可以通过 PlatformObjectChannel 与原生平台进行通信。首先,你需要创建一个 PlatformObjectChannel 实例:

import 'package:platform_object_channel/platform_object_channel.dart';

final platformChannel = PlatformObjectChannel('com.example.myapp/channel_name');

这里 'com.example.myapp/channel_name' 是通道的名称,它需要与原生代码中的通道名称一致。

2. 从 Flutter 发送消息到原生平台

你可以使用 invokeMethod 方法从 Flutter 向原生平台发送消息。你还可以传递复杂的对象作为参数:

final response = await platformChannel.invokeMethod('method_name', {'key': 'value'});
print('Response from native: $response');

method_name 是你在原生平台中定义的方法名,{'key': 'value'} 是你传递给原生平台的数据。

3. 在原生平台中处理消息

在原生平台(Android/iOS)中,你需要实现 PlatformObjectChannel 的对应逻辑。

Android:

在 Android 中,你需要在 MainActivity 中注册方法处理程序:

import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL_NAME = "com.example.myapp/channel_name";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new MethodChannel(getFlutterEngine().getDartExecutor(), CHANNEL_NAME).setMethodCallHandler(
                (call, result) -> {
                    if (call.method.equals("method_name")) {
                        // 处理来自 Flutter 的调用
                        Object arguments = call.arguments;
                        // 处理逻辑
                        result.success("Response from Android");
                    } else {
                        result.notImplemented();
                    }
                });
    }
}

iOS:

在 iOS 中,你需要在 AppDelegate 中注册方法处理程序:

#import <Flutter/Flutter.h>

@interface AppDelegate ()
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;

    FlutterMethodChannel* channel = [FlutterMethodChannel
        methodChannelWithName:@"com.example.myapp/channel_name"
              binaryMessenger:controller.binaryMessenger];

    [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
        if ([@"method_name" isEqualToString:call.method]) {
            // 处理来自 Flutter 的调用
            NSDictionary* arguments = call.arguments;
            // 处理逻辑
            result(@"Response from iOS");
        } else {
            result(FlutterMethodNotImplemented);
        }
    }];

    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

4. 从原生平台发送消息到 Flutter

你也可以从原生平台向 Flutter 发送消息。在 Flutter 中,你可以通过 setMethodCallHandler 来接收这些消息:

platformChannel.setMethodCallHandler((call) async {
    if (call.method == 'native_method_name') {
        // 处理来自原生平台的调用
        final arguments = call.arguments;
        return 'Response from Flutter';
    }
    return null;
});
回到顶部