Flutter原生模块通信插件module_bridge的使用

Flutter原生模块通信插件module_bridge的使用

Dart模块化开发事件通信库

步骤1

  1. 安装FlutterModuleBridge插件。
  2. 添加依赖:
dependencies:
    module_bridge: ^最新版本号

步骤2

在模块的/lib目录下创建一个通信模板。

import 'package:module_bridge/module_bridge.dart';

class UserBridge with Bridge {

   @Url(url: '/user/getUserId', desc: '获取用户ID')
   Future<R<int>> getUserId(Map<String, String> params) {
     return R.ok(data: 1234);
   }

   @Url(url: '/user/getUserName', desc: '获取用户名')
   Future<R<String>> getUserName(Map<String, String> params) async {
     return R.ok(data: 'azhon');
   }
}

注意

  • 一个dart文件只能有一个类。
  • 类必须包含 with Bridge
  • 方法必须用 @Url 注解。
  • 方法参数必须是 Map<String, String> 类型,返回值必须是 RFuture<R> 类型。

步骤3

  1. 使用 FlutterModuleBridge 插件生成类。
  2. 在子模块中创建模块并注册事件:
class UserModule extends BaseModule {
  [@override](/user/override)
  void register() {
    BridgeManager.instance.register(UserBridge().bridges);
  }

  [@override](/user/override)
  void unregister() {}
}
  1. 在主模块中初始化子模块:
ModuleManager.add(UserModule());

步骤4

在任何模块中通过以下代码进行通信:

var r = await BridgeManager.instance.get<int>('/user/getUserId');

或者在 build 方法中使用:

BridgeBuilder<int>(
  bridge: '/user/getUserId',
  builder: (_, data) {
    /// data 可能为null
    return Text('使用BridgeBuilder获取数据:$data');
  },
),

完整示例

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 module_bridge 插件来实现模块间的通信。

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:message_module/main.dart';
import 'package:message_module/view/message_page.dart';
import 'package:module_bridge/module_bridge.dart';
import 'package:user_module/view/user_page.dart';
import 'package:user_module/main.dart';

void main() {
  /// 初始化子模块
  runApp(const MyApp());
  ModuleManager.add(MessageModule());
  ModuleManager.add(UserModule());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Module Bridge',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Module Bridge'),
      ),
      body: SizedBox.expand(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _button(
              '前往MessageModule页面',
                () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => const MessagePage()),
                );
              },
            ),
            const SizedBox(height: 16),
            _button(
              '前往UserModule页面',
                () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (_) => const UserPage()),
                );
              },
            ),
          ],
        ),
      ),
    );
  }

  Widget _button(String text, VoidCallback press) {
    return TextButton(
      style: const ButtonStyle(
        backgroundColor: MaterialStatePropertyAll(Colors.blue),
        padding: MaterialStatePropertyAll(
            EdgeInsets.symmetric(vertical: 20, horizontal: 16)),
      ),
      onPressed: press,
      child: Text(
        text,
        style: const TextStyle(color: Colors.white),
      ),
    );
  }
}

更多关于Flutter原生模块通信插件module_bridge的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter原生模块通信插件module_bridge的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用module_bridge插件来实现原生模块通信的代码案例。这个插件允许Flutter与原生代码(iOS和Android)进行双向通信。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  module_bridge: ^最新版本号  # 请替换为最新版本号

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

2. 配置原生代码

iOS

在你的ios/Runner/Info.plist文件中,添加以下内容以允许URL schemes(如果需要的话):

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>your_custom_scheme</string>
        </array>
    </dict>
</array>

然后,在ios/Runner/AppDelegate.swift中,设置ModuleBridge

import UIKit
import Flutter
import module_bridge

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    // 设置ModuleBridge
    let bridge = ModuleBridge()
    bridge.setup(application: application, launchOptions: launchOptions)
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Android

在你的android/app/src/main/AndroidManifest.xml中,根据需要配置权限和activity等。

然后,在android/app/src/main/kotlin/你的包名/MainActivity.kt(或Java文件)中,设置ModuleBridge

package 你的包名

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import module_bridge.ModuleBridge

class MainActivity: FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 设置ModuleBridge
        ModuleBridge.setup(this, savedInstanceState)
    }
}

3. 在Flutter中使用module_bridge

发送消息到原生模块

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Module Bridge Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 发送消息到原生模块
              ModuleBridge.callNativeHandler("yourHandlerName", {"key": "value"})
                  .then((response) {
                print("Native response: $response");
              }).catchError((error) {
                print("Error: $error");
              });
            },
            child: Text('Send Message to Native'),
          ),
        ),
      ),
    );
  }
}

在原生模块中接收并处理消息

iOS

AppDelegate.swift或你自定义的类中实现消息处理:

import UIKit
import Flutter
import module_bridge

class MyNativeHandler: NSObject, ModuleBridgeHandler {
    func handle(_ message: [String: Any], completion: @escaping (Any?) -> Void) {
        if let key = message["key"] as? String {
            print("Received message from Flutter: \(key)")
            completion("Native response")
        } else {
            completion(nil)
        }
    }
}

// 在AppDelegate中注册handler
let nativeHandler = MyNativeHandler()
bridge.registerHandler("yourHandlerName", handler: nativeHandler)
Android

MainActivity.kt或你自定义的类中实现消息处理:

package 你的包名

import io.flutter.embedding.engine.FlutterEngine
import module_bridge.ModuleBridge
import module_bridge.ModuleBridgeHandler

class MyNativeHandler : ModuleBridgeHandler {
    override fun handle(message: Map<String, Any>, completion: (Any?) -> Unit) {
        val key = message["key"] as? String
        key?.let {
            println("Received message from Flutter: $it")
            completion("Native response")
        } ?: run {
            completion(null)
        }
    }
}

// 在MainActivity中注册handler
class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        
        val nativeHandler = MyNativeHandler()
        ModuleBridge.registerHandler(flutterEngine, "yourHandlerName", nativeHandler)
    }
}

以上代码展示了如何在Flutter应用中使用module_bridge插件进行原生模块通信。你可以根据需要进一步扩展和修改这些代码。

回到顶部