Flutter Tizen平台消息通信插件messageport_tizen的使用

Flutter Tizen平台消息通信插件messageport_tizen的使用

messageport_tizen

pub package

此插件为Tizen平台上Flutter应用之间的通信提供了支持。


使用方法

首先,在Dart文件中导入该包:

import 'package:messageport_tizen/messageport_tizen.dart';

创建本地端口

使用LocalPort.create()方法创建一个本地端口。

String portName = 'servicePort';
LocalPort localPort = await LocalPort.create(portName);

当消息到达本地端口时,可以注册回调函数以处理接收到的消息:

void onMessage(Object message, [RemotePort remotePort]) {
  // 处理接收到的消息。
}
...
localPort.register(onMessage);

当不再需要时,使用LocalPort.unregister()取消注册端口:

localPort.unregister();

连接到远程端口

要连接到远程应用程序中已注册的端口,使用RemotePort.connect()方法:

String portName = 'servicePort';
String remoteAppId = 'remote.app.id';
RemotePort remotePort = await RemotePort.connect(remoteAppId, portName);

发送消息

向远程应用程序发送消息,使用RemotePort.send()方法:

final message = {'a': 1, 'b': 2, 'c': 3};
await remotePort.send(message);

使用本地端口发送消息

在发送消息时包含本地端口信息,使用RemotePort.sendWithLocalPort()方法。远程应用程序接收到的本地端口可用于发送响应:

final message = 'This is a string message';
await remotePort.sendWithLocalPort(message, localPort);

支持的数据类型

该插件使用Flutter的StandardMessageCodec将传输的数据编码为二进制。支持的数据类型包括:

  • null
  • bool
  • int, double
  • String
  • Uint8List, Int32List, Int64List, Float64List
  • 上述类型的列表和映射

如需了解有关Tizen消息端口API的更多信息,请访问Tizen文档:消息端口


完整示例代码

以下是一个完整的示例代码,展示了如何使用messageport_tizen插件实现Flutter Tizen平台上的消息通信。

示例代码:main.dart

// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'package:flutter/material.dart';

import 'package:messageport_tizen/messageport_tizen.dart';

const String kPortName = 'servicePort';
const String kRemoteAppId = 'org.tizen.messageport_tizen_example';

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

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

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

class _MyAppState extends State<MyApp> {
  LocalPort? _localPort;
  RemotePort? _remotePort;
  int _responseCount = 0;

  void onMessage(dynamic message, [RemotePort? remotePort]) {
    _log('Message received: $message');

    if (remotePort != null) {
      _responseCount++;
      remotePort.send('Response: $_responseCount');
    }
  }

  Widget _textButton(String text, void Function() onPressed, bool enabled) {
    return Container(
      margin: const EdgeInsets.all(5),
      child: ElevatedButton(
        onPressed: enabled ? onPressed : null,
        child: Text(text),
      ),
    );
  }

  Widget _localPortRegisterButtons() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[
        _textButton(
          'Register',
          () async {
            try {
              _localPort?.register(onMessage);
              _log('Local port registration done');
              setState(() {});
            } catch (error) {
              _log(error.toString());
            }
          },
          _localPort != null && !_localPort!.registered,
        ),
        _textButton(
          'Unregister',
          () async {
            try {
              _localPort?.unregister();
              _log('Local port unregistration done');
              setState(() {});
            } catch (error) {
              _log(error.toString());
            }
          },
          _localPort?.registered ?? false,
        ),
      ],
    );
  }

  Widget _remotePortButtons() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[
        _textButton(
          'Connect to remote',
          () async {
            try {
              _remotePort = await RemotePort.connect(kRemoteAppId, kPortName);
              _log('Connected to remote port');
              setState(() {});
            } catch (error) {
              _log(error.toString());
            }
          },
          (_localPort?.registered ?? false) && _remotePort == null,
        ),
        _textButton(
          'Check remote',
          () async {
            try {
              final bool status = await _remotePort!.check();
              _log('Remote port status: ${status ? 'open' : 'closed'}');
              setState(() {});
            } catch (error) {
              _log(error.toString());
            }
          },
          _remotePort != null,
        ),
      ],
    );
  }

  final Map<String, Object> _sendOptions = <String, Object>{
    'bool': true,
    'int': 134,
    'double': 157.986,
    'String': 'Test message',
    'List': <int>[1, 2, 3],
    'Map': <String, int>{'a': 1, 'b': 2, 'c': 3}
  };
  bool _attachLocalPort = false;

  Widget _sendButtons() {
    return Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            Checkbox(
              value: _attachLocalPort,
              onChanged: (bool? value) {
                setState(() {
                  _attachLocalPort = value ?? false;
                });
              },
            ),
            const Text('Attach local port'),
          ],
        ),
        GridView.builder(
          shrinkWrap: true,
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3,
            mainAxisExtent: 40,
          ),
          itemCount: _sendOptions.length,
          itemBuilder: (BuildContext context, int index) {
            final String key = _sendOptions.keys.elementAt(index);
            return _textButton(
              key,
              () async {
                try {
                  final Object value = _sendOptions[key]!;
                  if (_attachLocalPort) {
                    await _remotePort?.sendWithLocalPort(value, _localPort!);
                  } else {
                    await _remotePort?.send(value);
                  }
                } catch (error) {
                  _log(error.toString());
                }
              },
              _remotePort != null && (_localPort?.registered ?? false),
            );
          },
        ),
      ],
    );
  }

  final List<String> _logs = <String>[];

  void _log(String log) {
    final String date = '${DateTime.now().hour.toString().padLeft(2, '0')}:'
        '${DateTime.now().minute.toString().padLeft(2, '0')}:'
        '${DateTime.now().second.toString().padLeft(2, '0')}.'
        '${DateTime.now().millisecond.toString().padLeft(3, '0')}';
    setState(() {
      _logs.add('$date: $log');
    });
    debugPrint('$date: $log');
  }

  Widget _logger(BuildContext context) {
    return Expanded(
      child: Container(
        padding: const EdgeInsets.all(5),
        child: GestureDetector(
          onTap: () {
            setState(() {
              _logs.clear();
            });
          },
          child: ListView.builder(
            itemCount: _logs.length,
            itemBuilder: (BuildContext context, int index) {
              return Text(
                _logs[index],
                style: const TextStyle(fontSize: 10),
              );
            },
          ),
        ),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Tizen MessagePort Example'),
        ),
        body: Column(children: <Widget>[
          _textButton(
            'Create local port',
            () async {
              _localPort = await LocalPort.create(kPortName);
              setState(() {});
            },
            _localPort == null,
          ),
          _localPortRegisterButtons(),
          _remotePortButtons(),
          _sendButtons(),
          _logger(context),
        ]),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _localPort?.unregister();
  }
}

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

1 回复

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


messageport_tizen 是一个用于在 Flutter 应用和 Tizen 平台之间进行消息通信的插件。它允许你在 Flutter 应用和 Tizen 平台之间发送和接收消息。以下是如何使用 messageport_tizen 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 messageport_tizen 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  messageport_tizen: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 messageport_tizen 插件:

import 'package:messageport_tizen/messageport_tizen.dart';

3. 初始化 MessagePort

在你的 Flutter 应用中初始化 MessagePort

final messagePort = MessagePort();

4. 注册本地端口

为了接收来自 Tizen 平台的消息,你需要注册一个本地端口:

messagePort.registerLocalPort('com.example.myapp.localport').then((_) {
  print('Local port registered');
}).catchError((error) {
  print('Failed to register local port: $error');
});

5. 监听消息

你可以监听来自 Tizen 平台的消息:

messagePort.listen((message) {
  print('Received message: $message');
});

6. 发送消息

你可以向 Tizen 平台发送消息:

messagePort.send('com.example.tizen.port', 'Hello from Flutter!').then((_) {
  print('Message sent');
}).catchError((error) {
  print('Failed to send message: $error');
});

7. 取消注册端口

当你不再需要接收消息时,可以取消注册本地端口:

messagePort.unregisterLocalPort().then((_) {
  print('Local port unregistered');
}).catchError((error) {
  print('Failed to unregister local port: $error');
});

8. Tizen 平台代码

在 Tizen 平台上,你需要使用相应的 API 来注册和发送消息。以下是一个简单的示例:

#include <message_port.h>

void on_message_received(int local_port_id, const char *remote_app_id, const char *remote_port, bool trusted_message, bundle *message, void *user_data) {
    // 处理接收到的消息
    printf("Received message: %s\n", bundle_get_str(message, "message"));
}

int main() {
    int local_port_id = message_port_register_local_port("com.example.tizen.port", on_message_received, NULL);

    // 发送消息到 Flutter 应用
    bundle *b = bundle_create();
    bundle_add_str(b, "message", "Hello from Tizen!");
    message_port_send_message("com.example.myapp.localport", b);
    bundle_free(b);

    // 取消注册端口
    message_port_unregister_local_port(local_port_id);

    return 0;
}

9. 处理消息

在 Flutter 应用中,你可以根据接收到的消息执行相应的操作。例如,更新 UI 或调用其他功能。

messagePort.listen((message) {
  print('Received message: $message');
  // 根据消息内容更新 UI 或执行其他操作
});

10. 错误处理

确保在注册端口、发送消息和接收消息时处理可能的错误。

messagePort.registerLocalPort('com.example.myapp.localport').then((_) {
  print('Local port registered');
}).catchError((error) {
  print('Failed to register local port: $error');
});
回到顶部