Flutter消息处理插件message_handler的使用
Flutter消息处理插件message_handler的使用
在本教程中,我们将学习如何使用 message_handler
插件来处理 Flutter 应用程序中的消息。该插件允许你自定义消息的设计,并添加中间件来处理消息。
开始
首先,你需要将 MessageManager
类添加到你的应用的顶层小部件树中。这允许你编辑标准消息的设计,发送消息并添加中间件。以下是一个示例:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MessageManager(
middlewares: const [TestMiddleware()], // 添加中间件列表,中间件必须继承自 MessageHandlerMiddleware。在显示消息之前调用 [可选,默认 => null]
alertDialog: , // 更改由消息处理器生成的警告对话框的基本设计 [可选,默认 => null]
bottomSheet: , // 更改由消息处理器生成的底部菜单的基本设计 [可选,默认 => null]
persistentSnackBar: , // 更改由消息处理器生成的持久性通知栏的基本设计 [可选,默认 => null]
snackBar: , // 更改由消息处理器生成的通知栏的基本设计 [可选,默认 => null]
child: const MyHomePage(title: 'Flutter Demo Home Page'), // [必需]
),
);
}
}
要发送消息,只需使用 sendMessage
函数并传递一个 NotificationMessage
对象。
messageHandler.sendMessage(
message: NotificationMessage(
level: NotificationMessageLevel.error, // 声明消息级别,这些级别包括:info, warning, error。必须通过 NotificationMessageLevel 枚举访问 [可选,默认 => error]
title: "测试消息", // 消息标题 [可选,默认 => null]
type: NotificationMessageType.alertDialog, // 声明消息类型,这些类型包括:alertDialog, snackBar, bottomSheet, persistentSnackBar。必须通过 NotificationMessageType 枚举访问 [可选,默认 => null]
content: "测试消息内容", // 消息内容 [必需]
onDismiss: () {} // 当消息被忽略时调用 [可选,默认 => null]
),
);
我们还可以在不触发用户消息的情况下调用中间件,只需调用 sendMessageToMiddlewares
方法:
messageHandler.sendMessageToMiddlewares(
level: NotificationMessageLevel.error, // 声明消息级别,这些级别包括:info, warning, error。必须通过 NotificationMessageLevel 枚举访问 [必需]
message: "测试中间件消息", // [可选,默认 => null]
throwable: null, // 抛出的异常 [可选,默认 => null]
);
示例代码
下面是一个完整的示例代码,展示了如何使用 message_handler
插件。
import 'package:flutter/material.dart';
import 'package:message_handler/message_handler.dart';
import 'package:message_handler/models/notification_message.dart';
void main() {
runApp(const MyApp());
}
// 定义一个中间件类,实现 MessageHandlerMiddleware 接口
class TestMiddleware implements MessageHandlerMiddleware {
const TestMiddleware();
[@override](/user/override)
void didShowMessage({
required NotificationMessageLevel level,
String? message,
Object? throwable,
}) {
debugPrint({
'level': level,
'message': message,
'throwable': throwable,
}.toString());
}
}
// 主应用类
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MessageManager(
middlewares: const [TestMiddleware()], // 添加中间件列表
child: const MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
// 主页面类
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// 发送不同的消息类型
messageHandler.sendMessage(
message: NotificationMessage(
content: "测试对话框", onDismiss: () {}),
);
messageHandler.sendMessage(
message: NotificationMessage(
title: "标题",
content: "测试通知栏",
type: NotificationMessageType.snackBar,
onDismiss: () {}),
);
messageHandler.sendMessage(
message: NotificationMessage(
title: "标题",
content: "测试底部菜单",
type: NotificationMessageType.bottomSheet,
level: NotificationMessageLevel.info,
onDismiss: () {}),
);
messageHandler.sendMessage(
message: NotificationMessage(
title: "标题",
content: "测试持久性通知栏",
type: NotificationMessageType.persistentSnackBar,
level: NotificationMessageLevel.warning,
onDismiss: () {}),
);
// 调用中间件
messageHandler.sendMessageToMiddlewares(
level: NotificationMessageLevel.error,
message: "测试中间件消息");
_counter++;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'你已经点击了按钮多少次:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '增加',
child: const Icon(Icons.add),
),
);
}
}
更多关于Flutter消息处理插件message_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter消息处理插件message_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用message_handler
插件来处理消息传递的示例代码。假设你已经在pubspec.yaml
文件中添加了message_handler
依赖并运行了flutter pub get
。
1. 添加依赖
首先,确保在pubspec.yaml
中添加依赖:
dependencies:
flutter:
sdk: flutter
message_handler: ^x.y.z # 替换为最新版本号
2. 配置原生代码(iOS和Android)
对于iOS,通常不需要额外配置,因为Flutter插件会自动处理。
对于Android,通常也不需要手动配置,但确保你的MainActivity
继承自FlutterActivity
。
3. 实现消息处理
3.1 主Flutter应用代码
创建一个新的Flutter项目或在现有项目中添加以下代码。
import 'package:flutter/material.dart';
import 'package:message_handler/message_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Message Handler Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Send a message to native code'),
ElevatedButton(
onPressed: () {
_sendMessageToNative('Hello from Flutter!');
},
child: Text('Send Message'),
),
],
),
),
),
);
}
void _sendMessageToNative(String message) {
MessageHandler.sendMessage(message).then((response) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Received response: $response'),
),
);
}).catchError((error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error: $error'),
backgroundColor: Colors.red,
),
);
});
}
}
3.2 原生代码处理消息
iOS (AppDelegate.swift)
在iOS项目中,你需要覆盖application:didFinishLaunchingWithOptions:
方法来注册消息处理器。不过,message_handler
插件通常已经为你处理了大部分设置,你只需确保在需要的地方接收消息。
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let navController = window?.rootViewController as? FlutterViewController {
navController.handleDeepLink(userActivity.webpageURL!) { (bool) in
// Handle deep link result
}
}
return true
}
}
// 你可以通过MethodCallHandler来接收和处理来自Flutter的消息
// 例如:
class MyMessageHandler: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterRegistrar) {
let channel = FlutterMethodChannel(name: "your_channel_name", binaryMessenger: registrar.messenger())
let instance = MyMessageHandler()
channel.setMethodCallHandler(instance)
}
func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "yourMethodName" {
guard let message = call.arguments as? String else {
result(FlutterError(code: "ARGUMENT_ERROR", message: "Invalid argument", details: nil))
return
}
// 处理消息
let response = "Message received: \(message)"
result(response)
} else {
result(FlutterMethodNotImplementedError(methodName: call.method))
}
}
}
注意:上面的iOS代码是一个示例,message_handler
插件通常已经为你处理了通道和方法调用,你只需在原生代码中处理特定的消息。
Android (MainActivity.kt)
在Android项目中,同样,message_handler
插件已经处理了大部分设置。你只需在需要的地方接收消息。
package com.example.yourapp
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
class MainActivity: FlutterActivity() {
private val CHANNEL = "your_channel_name"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "yourMethodName") {
val message = call.argument<String>() ?: ""
// 处理消息
val response = "Message received: $message"
result.success(response)
} else {
result.notImplemented()
}
}
}
}
4. 运行应用
现在,你可以运行你的Flutter应用,点击按钮发送消息到原生代码,并接收原生代码的响应。
这个示例展示了如何在Flutter和原生代码之间传递消息。实际应用中,你可能需要根据具体需求调整消息处理逻辑。