Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在eventChannel回调方法中解析对象变量?_Flutter_Dart_Hashmap - Fatal编程技术网

Flutter 如何在eventChannel回调方法中解析对象变量?

Flutter 如何在eventChannel回调方法中解析对象变量?,flutter,dart,hashmap,Flutter,Dart,Hashmap,我正在编写一个flatter应用程序,其中我有一个来自本机系统的回调,其中包含一些nfc信息。我通过以下代码行注册回调: eventChannel.receiveBroadcastStream().listen(\u-onEvent,onError:\u-onError); 回调如下所示: void\u onEvent(对象事件){ //接收事件 打印(“收到NFC事件”); //获取有效载荷 事件['Payload'];//这不起作用,它给出了一个错误 } 但是我如何解析数据呢?我知道它包

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

eventChannel.receiveBroadcastStream().listen(\u-onEvent,onError:\u-onError);
回调如下所示:

void\u onEvent(对象事件){
//接收事件
打印(“收到NFC事件”);
//获取有效载荷
事件['Payload'];//这不起作用,它给出了一个错误
}
但是我如何解析数据呢?我知道它包含一个名为
Payload
的字段,但是我无法通过
event['Payload']
访问它


我很困惑,我试图将其转换为另一种类型,如下所示:
Map eventMap=Map.from(event)但那不起作用。有人能指出我做错了什么,以及如何正确提取数据吗?

您是否尝试过
event.toString()
?它可能返回一个字符串,其中包含您试图获取的字段,您可以轻松地从中解析值

您还可以尝试:

Class<?> clazz = event.getClass();
Field payload= clazz.getField("Payload"); //Note, this can throw an exception if the field doesn't exist.
String fieldValue = payload.toString();
Class clazz=event.getClass();
字段有效载荷=clazz.getField(“有效载荷”)//注意,如果该字段不存在,则可能引发异常。
String fieldValue=payload.toString();

如果它没有返回您想要的内容,您可能需要使用get方法为对象类型创建一个接口,或者重写toString方法以获取并返回有效负载值。

我建议不要使用太多关于本机部分的信息 您可以引用此包或分叉此 直接
此repo修复了pub.dev的一些问题,并在实际设备中运行良好

您需要的dart代码驻留在其中

}

编辑添加更多详细信息
akeblom向IOS添加了写NFC功能,所以IOS部分应该可以工作。请使用这个叉子
对于IOS缺失插件异常问题,我没有IOS,我建议您可以询问akeblom
如果我没有误解,您在评论中提到的数据部分是第77行,请参见下面的描述

在Android部分。
第174行,use 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)
        }

第22行,带命名构造函数

 factory NfcData.fromMap(Map data) {
    NfcData result = NfcData(
      id: data['nfcId'],
      content: data['nfcContent'],
      error: data['nfcError'],
      statusMapper: data['nfcStatus'],
    );
在第77行,NFC read start和_OneEvent(动态数据)获取数据。 流使用此命名构造函数,并解析数据,此处使用映射((结果))传输到NfcData

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

我发现将事件解析为映射的最简单方法如下: 我将变量编码为字符串(但我使用
json.encode(event)
而不是
event.toString()
作为
encode(event)
返回有效字符串

然后我使用这个字符串通过
json.decode
构建一个映射。所有这些都是通过flatter本机库dart:convert实现的。完整的代码如下所示:

导入'dart:convert';
...
void _onEvent(动态事件){
//接收事件
打印(“收到NFC事件”);
字符串str=json.encode(事件);
Map eventMap=json.decode(str);
}

感谢您的快速响应。event.toString()确实有效,但是我必须解析结果字符串,它只是连接的整个消息。我想知道是否有直接的方法来获取
有效负载
消息。您好,我尝试了原始插件,但不幸的是,该插件不能与IOS一起使用。错误也在github页面上描述:。这就是为什么我选择实现自己的插件解决方案。关于您的代码片段:我看不出如何提取事件的
数据
?我没有IOS。您是否检查了我提供的不是github.com/matteocrippa的链接。在akeblom中,他将写nfc功能添加到IOS中。因此它应该可以工作,或者您可以要求akeblomI添加更多细节来回答
static Stream<NfcData> get read {
    final resultStream = _channel
        .invokeMethod('NfcRead')
        .asStream()
        .asyncExpand((_) => stream
            .receiveBroadcastStream()
            .map((result) => NfcData.fromMap(result)));
    return resultStream;
FlutterNfcReader.read.listen((response) {
      setState(() {
        _nfcData = response;
      });
    });