Flutter原生模块通信插件module_bridge的使用
Flutter原生模块通信插件module_bridge的使用
Dart模块化开发事件通信库
步骤1
- 安装FlutterModuleBridge插件。
- 添加依赖:
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>
类型,返回值必须是R
或Future<R>
类型。
步骤3
- 使用
FlutterModuleBridge
插件生成类。 - 在子模块中创建模块并注册事件:
class UserModule extends BaseModule {
[@override](/user/override)
void register() {
BridgeManager.instance.register(UserBridge().bridges);
}
[@override](/user/override)
void unregister() {}
}
- 在主模块中初始化子模块:
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
更多关于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
插件进行原生模块通信。你可以根据需要进一步扩展和修改这些代码。