Flutter NFC功能插件nfc_in_flutter的使用

发布于 1周前 作者 eggper 来自 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

'Turn on Near Field Communication Tag Reading' capability  turned on for a project in Xcode

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

1 回复

更多关于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" />
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!