Flutter跨平台通信插件suspension_bridge的使用

Flutter跨平台通信插件suspension_bridge的使用

Suspension Bridge

这个简单但功能强大的包提供了一个通信层,可以将多个Flutter项目连接在一起。

Suspension Bridge实现了以下功能:

  1. 双向数据通信
  2. 双向方法调用处理和方法调用

这个项目受到了Method Channel API的启发。

数据传递

你可以将数据保存到一个通道中。

SuspensionBridge().addChannelData(
      'investment',
      'authData',
      {
        "accessToken": "<一些令牌字符串>",
        "refreshToken": "<一些令牌字符串>"
      },
    );

同样的数据可以在另一个Flutter项目中提取。

final authData = SuspensionBridge().getChannelData(
      'investment',
      'authData',
    );

方法调用处理

注册方法调用处理器。

SuspensionBridge().registerMethodCallHandler(
    'golden-gate-bridge',
    (SuspensionBridgeMethod method) {
      print('Received method call: ${method.methodName}');
      if (method.methodName == 'print') {
        print(method.methodData?.runtimeType);
        print(method.methodData);
      } else if (method.methodName == 'prettyPrint') {
        print('-- Pretty print starts --');
        print(method.methodData?.runtimeType);
        print(method.methodData);
        print('-- Pretty print ends --');
      }
    },
  );

从不同的位置调用方法。

SuspensionBridge().invokeMethod(
'golden-gate-bridge',
SuspensionBridgeMethod(
    'prettyPrint',
    methodData: 'Hello, world! Welcome to Golden Gate Bridge!',
),
);

SuspensionBridge().invokeMethod(
'golden-gate-bridge',
SuspensionBridgeMethod(
    'print',
    methodData: ['Hello', 'world!'],
),
);

示例代码

以下是一个完整的示例代码,展示了如何使用suspension_bridge插件进行跨平台通信。

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

void main() {
  // 注册方法调用处理器
  SuspensionBridge().registerMethodCallHandler(
    'golden-gate-bridge',
    (SuspensionBridgeMethod method) {
      print('Received method call: ${method.methodName}');
      if (method.methodName == 'print') {
        print(method.methodData?.runtimeType);
        print(method.methodData);
      } else if (method.methodName == 'prettyPrint') {
        print('-- Pretty print starts --');
        print(method.methodData?.runtimeType);
        print(method.methodData);
        print('-- Pretty print ends --');
      }
    },
  );

  // 调用方法
  SuspensionBridge().invokeMethod(
    'golden-gate-bridge',
    SuspensionBridgeMethod(
      'prettyPrint',
      methodData: 'Hello, world! Welcome to Golden Gate Bridge!',
    ),
  );

  SuspensionBridge().invokeMethod(
    'golden-gate-bridge',
    SuspensionBridgeMethod(
      'print',
      methodData: ['Hello', 'world!'],
    ),
  );

  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用suspension_bridge插件进行跨平台通信的代码示例。suspension_bridge是一个用于在Flutter与原生平台(iOS和Android)之间进行高效通信的插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  suspension_bridge: ^最新版本号 # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

2. 配置原生代码

iOS

ios/Runner/Info.plist文件中,确保你有适当的权限配置(如果需要)。

Android

android/app/src/main/AndroidManifest.xml文件中,同样确保你有适当的权限配置(如果需要)。

3. 设置SuspensionBridge

Flutter端代码

在你的Flutter项目中,初始化SuspensionBridge并进行通信。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SuspensionBridge Demo'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late SuspensionBridge _bridge;

  @override
  void initState() {
    super.initState();
    // 初始化SuspensionBridge
    _bridge = SuspensionBridge();

    // 注册一个接收来自原生平台消息的方法
    _bridge.registerHandler('fromNative', (data) {
      print('Received from native: $data');
      // 这里可以处理从原生平台接收到的数据
    });

    // 发送消息到原生平台
    _sendMessageToNative();
  }

  void _sendMessageToNative() {
    Map<String, dynamic> message = {'key': 'value'};
    _bridge.send('toNative', message);
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // 每次点击按钮时发送消息到原生平台
        _sendMessageToNative();
      },
      child: Text('Send Message to Native'),
    );
  }
}

原生端代码(iOS)

ios/Runner/AppDelegate.swift中配置SuspensionBridge

import UIKit
import Flutter
import suspension_bridge

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // 配置SuspensionBridge
    let bridge = SuspensionBridge()
    bridge.register(handler: "toNative") { (call, result) in
      guard let data = call.arguments as? [String: Any] else {
        result("Invalid data")
        return
      }
      print("Received from Flutter: \(data)")
      
      // 发送消息回Flutter
      let response = ["response": "Hello from iOS"]
      result(response)
    }

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

原生端代码(Android)

android/app/src/main/kotlin/你的包名/MainActivity.kt中配置SuspensionBridge

package 你的包名

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import suspension_bridge.SuspensionBridge

class MainActivity: FlutterActivity() {
    private val CHANNEL = "your.channel.name/suspension_bridge"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        // 配置SuspensionBridge
        val bridge = SuspensionBridge(flutterEngine.dartExecutor.binaryMessenger)
        bridge.registerHandler("toNative") { call: MethodCall, result: MethodChannel.Result ->
            val data = call.arguments as? Map<String, Any>
            data?.let {
                println("Received from Flutter: $data")
                
                // 发送消息回Flutter
                val response = mapOf("response" to "Hello from Android")
                result.success(response)
            } ?: run {
                result.error("INVALID_ARGUMENT", "Invalid data", null)
            }
        }
    }
}

注意:在Android代码中,确保你的MainActivity.kt文件位于正确的包路径下,并且已经导入了必要的库。

4. 运行应用

现在,你可以运行你的Flutter应用,并通过点击按钮来测试跨平台通信。每次点击按钮时,Flutter端会发送消息到原生平台,原生平台接收到消息后会打印出来,并可以发送响应回Flutter端。

这个示例展示了如何使用suspension_bridge插件在Flutter与原生平台之间进行基本的通信。根据你的具体需求,你可以扩展这个示例来处理更复杂的数据和逻辑。

回到顶部