Flutter通信插件bitchannel的使用

Flutter通信插件bitchannel的使用

bitchannel

bitchannel 是一个基于通道和信息片段的事件导向包与通信基础设施包的混合体。

安装

要将该插件添加到您的 Flutter 项目中,请运行以下命令:

flutter pub add bitchannel

使用

在 Dart 代码中导入 bitchannel 包:

import 'package:bitchannel/bitchannel.dart';

创建一个信息片段

信息片段是一个通过通道发送的信息。您可以创建自己的信息片段类,继承自 Bit 类:

final class TestBit extends Bit {
  [@override](/user/override)
  String get bitChannel => "test";

  [@override](/user/override)
  Map<String, dynamic> get data => {
        "something": "in the way",
      };
}

加入通道

要开始监听通道,可以使用 BitChannel.join 方法。以下是一个带有接收器的例子:

class MyBitReceiver with BitService {
  MyBitReceiver() {
    BitChannel.join("testChannel", from: this);
  }

  [@override](/user/override)
  Map<Type, Function(Bit bit)> get bitMap => {
        TestBit: (bit) => print("Received a TestBit!"),
      };
}

void main() {
  MyBitReceiver();
}

发送信息片段

要发送一个信息片段,只需创建您的信息片段类的一个实例。以下是一个使用之前创建的 TestBit 类的例子:

void main() {
  TestBit();  // 这将会自动发送到 "testChannel"
}

更改日志级别

您可以通过更改日志级别来控制日志的详细程度:

void main() {
  Bit.logLevel = LogLevel.trace;
}

设置全局数据

您可以设置全局数据,这些数据将包含在所有信息片段中:

void main() {
  Bit.globals = {
    "hello": "world",
  };
}

在小部件中处理信息片段

您可以通过混合适当的混入类来在状态小部件和无状态小部件中处理信息片段:

状态小部件

class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> with BitState {
  bool _debug = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("BitChannel Example"),
      ),
      body: Center(
        child: Text("Debug mode is ${_debug ? "ON" : "OFF"}"),
      ),
    );
  }

  [@override](/user/override)
  String get bitChannel => "testChannel";

  [@override](/user/override)
  Map<Type, Function(Bit bit)> get bitMap => {
        TestBit: (bit) {
          setState(() {
            _debug = !_debug;
          });
        },
      };
}

无状态小部件

class MyStatelessWidget extends StatelessWidget with OnBit<TestBit> {
  MyStatelessWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("BitChannel Example"),
      ),
      body: Center(
        child: TextButton(
          onPressed: () => TestBit(),
          child: Text("Send TestBit"),
        ),
      ),
    );
  }

  [@override](/user/override)
  String get bitChannel => "testChannel";
}

示例

以下是一个完整的 Flutter 应用程序示例,使用 BitChannel

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

void main() {
  Bit.logLevel = LogLevel.debug;
  runApp(const MyApp());
  test();
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with BitState {
  bool _debug = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("BitChannel Example"),
        ),
        body: Center(
          child: Text("Debug mode is ${_debug ? "ON" : "OFF"}"),
        ),
      ),
    );
  }

  [@override](/user/override)
  String get bitChannel => "testChannel";

  [@override](/user/override)
  Map<Type, Function(Bit bit)> get bitMap => {
        TestBit: (bit) {
          setState(() {
            _debug = !_debug;
          });
        },
      };
}

class TestBit extends Bit {
  [@override](/user/override)
  String get bitChannel => "testChannel";

  [@override](/user/override)
  Map<String, dynamic> get data => {
        "something": "in the way",
      };
}

void test() {
  TestBit();
}

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

1 回复

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


BasicMessageChannel 是 Flutter 中用于在 Flutter 和平台(Android 或 iOS)之间进行简单消息传递的一种通信机制。它允许你发送和接收消息,并且可以在 Flutter 和原生代码之间进行双向通信。以下是如何使用 BasicMessageChannel 的基本步骤。

1. 在 Flutter 中创建 BasicMessageChannel

首先,在 Flutter 中创建一个 BasicMessageChannel

import 'package:flutter/services.dart';

final BasicMessageChannel<String> messageChannel = BasicMessageChannel<String>(
  'com.example.myapp/message', // 通道名称
  StringCodec(), // 消息编解码器
);

2. 在 Flutter 中发送和接收消息

你可以使用 send 方法向平台发送消息,并使用 setMessageHandler 方法来接收来自平台的消息。

void sendMessage() async {
  String response = await messageChannel.send('Hello from Flutter');
  print('Response from platform: $response');
}

void setMessageHandler() {
  messageChannel.setMessageHandler((String? message) async {
    print('Received message from platform: $message');
    return 'Hello from Flutter (response)';
  });
}

3. 在 Android 中实现 BasicMessageChannel

在 Android 的 MainActivity 中,你需要设置 BasicMessageChannel

import io.flutter.plugin.common.BasicMessageChannel
import io.flutter.plugin.common.StringCodec
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar

class MainActivity: FlutterActivity() {
    private lateinit var messageChannel: BasicMessageChannel<String>

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        messageChannel = BasicMessageChannel(
            flutterEngine.dartExecutor.binaryMessenger,
            "com.example.myapp/message",
            StringCodec.INSTANCE
        )

        messageChannel.setMessageHandler { message, reply ->
            Log.d("MainActivity", "Received message from Flutter: $message")
            reply.reply("Hello from Android")
        }
    }

    fun sendMessageToFlutter() {
        messageChannel.send("Hello from Android") { response ->
            Log.d("MainActivity", "Response from Flutter: $response")
        }
    }
}

4. 在 iOS 中实现 BasicMessageChannel

在 iOS 的 AppDelegate 中,你需要设置 BasicMessageChannel

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    var messageChannel: FlutterBasicMessageChannel?

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller = window?.rootViewController as! FlutterViewController
        messageChannel = FlutterBasicMessageChannel(
            name: "com.example.myapp/message",
            binaryMessenger: controller.binaryMessenger,
            codec: FlutterStringCodec.sharedInstance()
        )

        messageChannel?.setMessageHandler { (message, reply) in
            print("Received message from Flutter: \(message ?? "")")
            reply("Hello from iOS")
        }

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

    func sendMessageToFlutter() {
        messageChannel?.sendMessage("Hello from iOS") { (response) in
            print("Response from Flutter: \(response ?? "")")
        }
    }
}

5. 在 Flutter 中调用原生代码

你可以在 Flutter 中调用 sendMessage 方法来向平台发送消息,并接收平台的响应。

void main() {
  setMessageHandler();
  sendMessage();
}
回到顶部