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