Flutter NFC功能插件nfc_in_flutter的使用
Flutter NFC功能插件nfc_in_flutter的使用
NFC在Flutter中的插件用于在Flutter中读取和写入NFC标签。它在Android和iOS上都能运行,并且具有简单的流式接口。
⚠️ 当前仅支持NDEF格式的标签。
使用
读取NFC标签
// NFC.readNDEF返回一个NDEFMessage的流
Stream<NDEFMessage> stream = NFC.readNDEF();
stream.listen((NDEFMessage message) {
print("记录数: ${message.records.length}");
});
读取单个NFC标签
NDEFMessage message = await NFC.readNDEF(once: true).first;
print("负载: ${message.payload}");
// once: true 只扫描一个标签!
向标签写入数据
你可以通过NDEFMessage
的.tag
属性访问NFC标签。该标签有一个.write
方法,允许你将NDEF消息写入标签。
注意:调用
.write
方法时,读取流必须仍然处于打开状态。这意味着在.readNDEF()
中不能使用once
参数。
Stream<NDEFMessage> stream = NFC.readNDEF();
stream.listen((NDEFMessage message) {
NDEFMessage newMessage = NDEFMessage.withRecords(
NDEFRecord.mime("text/plain", "hello world")
);
message.tag.write(newMessage);
});
你也可以使用NFC.writeNDEF(NDEFMessage)
方法,该方法包装了上述代码并支持once
参数。
NDEFMessage newMessage = NDEFMessage.withRecords(
NDEFRecord.mime("text/plain", "hello world")
);
Stream<NDEFTag> stream = NFC.writeNDEF(newMessage);
stream.listen((NDEFTag tag) {
print("写入标签完成");
});
如果你只想写入一个标签,可以将once
参数设置为true
。
NDEFMessage newMessage = NDEFMessage.withRecords(
NDEFRecord.mime("text/plain", "hello world")
);
Stream<NDEFTag> stream = NFC.writeNDEF(newMessage, once: true);
stream.listen((NDEFTag tag) {
print("仅写入了一个标签!");
});
如果你更喜欢基于Future
的API,可以等待返回流的.first
方法。
NDEFMessage newMessage = NDEFMessage.withRecords(
NDEFRecord.type("text/plain", "hello world")
);
await NFC.writeNDEF(newMessage, once: true).first;
示例
import 'package:nfc_in_flutter/nfc_in_flutter.dart';
class NFCReader extends StatefulWidget {
@override
_NFCReaderState createState() => _NFCReaderState();
}
class _NFCReaderState extends State {
bool _supportsNFC = false;
bool _reading = false;
StreamSubscription<NDEFMessage> _stream;
@override
void initState() {
super.initState();
// 检查设备是否支持NFC读取
NFC.isNDEFSupported
.then((bool isSupported) {
setState(() {
_supportsNFC = isSupported;
});
});
}
@override
Widget build(BuildContext context) {
if (!_supportsNFC) {
return RaisedButton(
child: const Text("您的设备不支持NFC"),
onPressed: null,
);
}
return RaisedButton(
child: Text(_reading ? "停止读取" : "开始读取"),
onPressed: () {
if (_reading) {
_stream?.cancel();
setState(() {
_reading = false;
});
} else {
setState(() {
_reading = true;
// 开始读取使用NFC.readNDEF()
_stream = NFC.readNDEF(
once: true,
throwOnUserCancel: false,
).listen((NDEFMessage message) {
print("读取NDEF消息: ${message.payload}"),
}, onError: (e) {
// 查看错误处理指南
});
});
}
}
);
}
}
完整示例可在此处查看。
安装
在pubspec.yaml
中添加nfc_in_flutter
依赖:
dependencies:
nfc_in_flutter: 2.0.5
iOS
在iOS上,你必须启用近场通信功能,添加NFC使用说明和NFC权限。
启用近场通信标签读取
在Xcode中打开你的iOS项目,找到项目的target并导航到Capabilities。向下滚动到“Near Field Communication Tag Reading”并启用它。
启用“Near Field Communication Tag Reading”
- 将NFC标签读取功能添加到App ID。
- 将Near Field Communication Tag Reader Session Formats Entitlement添加到权限文件中。
来自developer.apple.com: Building an NFC Tag-Reader app

NFC使用说明
打开你的ios/Runner/Info.plist
文件并添加一个新的NFCReaderUsageDescription
键。其值应是你计划使用NFC的目的描述。
<key>NFCReaderUsageDescription</key>
<string>...</string>
Android
在你的应用的AndroidManifest.xml
文件中添加以下内容:
<uses-permission android:name="android.permission.NFC" />
如果您的应用需要NFC,可以在只允许下载支持NFC设备的应用中添加以下内容:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
什么是NDEF?
如果你是NFC的新手,你可能会期待很多readNFC()
调用,但相反你会看到readNDEF()
和NDEFMessage
。NDEF只是一个标签可以编码的标准格式。除了NDEF之外还有其他编码方式,但NDEF是最常见的。目前Flutter中的NFC仅支持NDEF格式的标签。
主机卡仿真
Flutter中的NFC支持从仿真主机卡读取。
要从仿真主机卡读取,你需要做几件事。
- 调用
readNDEF()
并将readerMode
参数设置为NFCDispatchReaderMode
的实例。 - 在你的
AndroidManifest.xml
活动中的<intent-filter>
插入以下内容:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
更多关于Flutter NFC功能插件nfc_in_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter NFC功能插件nfc_in_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
nfc_in_flutter
是一个用于在 Flutter 应用中实现 NFC 功能的插件。它允许你读取和写入 NFC 标签,并处理 NFC 相关的操作。以下是如何在 Flutter 项目中使用 nfc_in_flutter
插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 nfc_in_flutter
插件的依赖。
dependencies:
flutter:
sdk: flutter
nfc_in_flutter: ^3.0.0
然后运行 flutter pub get
来安装依赖。
2. 配置 Android 和 iOS 项目
Android
在 android/app/src/main/AndroidManifest.xml
文件中添加以下权限和特性:
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
在 <application>
标签内添加以下内容:
<activity android:name="com.example.app.MainActivity" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
iOS
在 ios/Runner/Info.plist
文件中添加以下内容:
<key>NFCReaderUsageDescription</key>
<string>We need access to NFC to read tags.</string>
3. 使用 nfc_in_flutter
插件
初始化 NFC
在你的 Dart 文件中,首先导入 nfc_in_flutter
插件:
import 'package:nfc_in_flutter/nfc_in_flutter.dart';
然后初始化 NFC:
void initNFC() async {
bool isAvailable = await NFC.isNDEFSupported;
if (isAvailable) {
print("NFC is supported on this device.");
} else {
print("NFC is not supported on this device.");
}
}
读取 NFC 标签
你可以使用 NFC.readNDEF()
方法来读取 NFC 标签:
void readNFC() async {
try {
NDEFMessage message = await NFC.readNDEF();
for (NDEFRecord record in message.records) {
print("Record type: ${record.type}");
print("Record payload: ${record.payload}");
}
} catch (e) {
print("Error reading NFC tag: $e");
}
}
写入 NFC 标签
你可以使用 NFC.writeNDEF()
方法来写入 NFC 标签:
void writeNFC() async {
try {
NDEFMessage message = NDEFMessage.withRecords([
NDEFRecord.text("Hello, NFC!"),
]);
await NFC.writeNDEF(message);
print("NFC tag written successfully.");
} catch (e) {
print("Error writing NFC tag: $e");
}
}
监听 NFC 事件
你可以使用 NFC.onNDEFDiscovered
来监听 NFC 标签的发现事件:
void listenNFC() {
NFC.onNDEFDiscovered.listen((NDEFMessage message) {
for (NDEFRecord record in message.records) {
print("Record type: ${record.type}");
print("Record payload: ${record.payload}");
}
});
}
4. 处理权限
在 Android 上,你需要确保应用具有 NFC 权限。你可以在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.NFC" />