flutter - 如何在 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);
但这没有用。有人可以指出我做错了什么以及如何正确提取数据吗?
解决方案
没有太多原生部分的信息,我建议你可以参考这个包或
直接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;
});
});
推荐阅读
- javascript - 有没有办法在 cocos creator 中的类上创建自定义事件和调度事件?
- c# - 忽略少数字符的正则表达式,直到找到提到的模式
- c++11 - 我需要一些可以在现有 BST 实现上实现的实践方法
- python - 使用条件计算更多列中的连续缺失值(nan)
- java - Android - 具有各种动态内容的 RecyclerView,每个项目都不同
- mysql - 创建记录时自动设置 Javascript 时间戳(以毫秒为单位)
- ruby - 无法下载硒 Windows 10
- java - 如何从 html 表单获取日期到 servlet
- java - 如何配置 CAS 以验证代理票证
- angular - 如果选中“任何地方”选项,则清除复选框