Flutter消息处理插件message_handler的使用

发布于 1周前 作者 eggper 来自 Flutter

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

1 回复

更多关于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和原生代码之间传递消息。实际应用中,你可能需要根据具体需求调整消息处理逻辑。

回到顶部