首页 > 解决方案 > 如何在 eventChannel 回调方法中解析对象变量?

问题描述

我正在编写一个颤振应用程序,其中我有一个来自本机系统的回调,其中包含一些 nfc 信息。我通过以下代码行注册回调:

eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);

回调如下所示:

void _onEvent(Object event) {
    //Receive Event
    print("NFC Event received");

    //Get the Payload
    event['Payload']; //This does not work, it gives an error
  }

但是我怎样才能解析出数据呢?我知道它包含一个名称字段,Payload但是我无法通过event['Payload'].

我很困惑,我试图将它转换为这样的另一种类型:Map<String, String> eventMap = Map<String, String>.from(event);但这没有用。有人可以指出我做错了什么以及如何正确提取数据吗?

标签: flutterdarthashmap

解决方案


没有太多原生部分的信息,我建议你可以参考这个包或 直接fork 这个https://github.com/akeblom/flutter-nfc-reader
这个 repo 修复了 pub.dev 的一些问题并在真实设备中运行良好

您需要的 dart 代码位于 https://github.com/akeblom/flutter-nfc-reader/blob/master/lib/flutter_nfc_reader.dart

void _onEvent(dynamic data) {
print("Event");
print(data);

}

编辑添加更多细节
akeblom 已将写入 NFC 功能添加到 IOS,因此 IOS 部分应该可以工作。请 ue 这个fork https://github.com/akeblom/flutter-nfc-reader
对于IOS MissingPluginException 问题,我没有IOS,建议你可以问akeblom
你在评论中提到的数据部分如果我没有误解是line 77,请看下面的描述

在安卓部分。 https://github.com/akeblom/flutter-nfc-reader/blob/master/android/src/main/kotlin/it/matteocrippa/flutternfcreader/FlutterNfcReaderPlugin.kt
第174行,使用kotlin mapOf 返回一个新的只读映射将指定的内容和 eventSink.success 结果发送到 Dart

if (message != null) {
            val data = mapOf(kId to id, kContent to message, kError to "", kStatus to "read")
            eventSink?.success(data)
        }

https://github.com/akeblom/flutter-nfc-reader/blob/master/lib/flutter_nfc_reader.dart
第 22 行,带有命名构造函数

 factory NfcData.fromMap(Map data) {
    NfcData result = NfcData(
      id: data['nfcId'],
      content: data['nfcContent'],
      error: data['nfcError'],
      statusMapper: data['nfcStatus'],
    );

在第 77 行,NFC 读取开始和 _onEvent(dynamic data) 获取数据。流使用这个命名的构造函数,并解析数据,这里用 map((result)) 传输到 NfcData

static Stream<NfcData> get read {
    final resultStream = _channel
        .invokeMethod('NfcRead')
        .asStream()
        .asyncExpand((_) => stream
            .receiveBroadcastStream()
            .map((result) => NfcData.fromMap(result)));
    return resultStream;

https://github.com/akeblom/flutter-nfc-reader/blob/master/example/lib/main.dart

第 33 行,响应已转移到 NfCData,因此示例只需使用 _nfcData = response;

FlutterNfcReader.read.listen((response) {
      setState(() {
        _nfcData = response;
      });
    });

推荐阅读