Flutter NFC管理插件nfc_manager_new的使用

Flutter NFC管理插件nfc_manager_new的使用

nfc_manager_new 插件用于管理和操作NFC标签,并支持设置密码、移除密码及通过密码进行认证。

开始使用

注意: 此插件依赖于 NFCTagReaderSession(需要iOS 13.0或更高版本)和 NfcAdapter#enableReaderMode(需要Android API级别19或更高版本)。

设置

Android设置

  • AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.NFC" />

iOS设置

  • 添加 Near Field Communication Tag Reader Session Formats Entitlements 到你的 entitlements 文件。
  • Info.plist 中添加 NFCReaderUsageDescription
  • 根据需要在 Info.plist 中添加 com.apple.developer.nfc.readersession.felica.systemcodescom.apple.developer.nfc.readersession.iso7816.select-identifiers

使用方法

处理会话

// 检查可用性
bool isAvailable = await NfcManager.instance.isAvailable();

// 启动会话
NfcManager.instance.startSession(
  onDiscovered: (NfcTag tag) async {
    // 在这里处理发现的NfcTag实例
  },
);

// 停止会话
NfcManager.instance.stopSession();

处理平台标签

以下平台标签类是可用的:

  • Ndef
  • FeliCa(仅限iOS)
  • Iso7816(仅限iOS)
  • Iso15693(仅限iOS)
  • MiFare(仅限iOS)
  • NfcA(仅限Android)
  • NfcB(仅限Android)
  • NfcF(仅限Android)
  • NfcV(仅限Android)
  • IsoDep(仅限Android)
  • MifareClassic(仅限Android)
  • MifareUltralight(仅限Android)
  • NdefFormatable(仅限Android)

可以通过调用类上的工厂构造函数 from 获取实例。例如:

Ndef? ndef = Ndef.from(tag);

if (ndef == null) {
  print('Tag is not compatible with NDEF');
  return;
}

// 在这里处理Ndef实例

请参阅 API 文档 以获取更多详细信息。

实际应用

查看 此仓库,它展示了如何使用此插件的实际应用。

完整示例

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:nfc_manager_new/nfc_manager_new.dart';
import 'package:nfc_manager_new/nfc_manager_utlity.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _nfcManagerNewPlugin = NfcManagerNew();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能失败,因此我们使用try/catch处理PlatformException
    // 我们还处理消息可能返回null的情况
    try {
      platformVersion = await _nfcManagerNewPlugin.getPlatformVersion() ?? 
          'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果小部件从树中被移除而异步平台消息正在飞行,则我们希望丢弃回复而不是调用setState来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    var size = MediaQuery.of(context).size;
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            InkWell(
              onTap: () async {
                final isRemovePassword = await NfcManager.instance.startSession(
                    alertMessage:
                        'Hold the NFC tag on the upper back of your iPhone',
                    onDiscovered: (NfcTag tag) async {
                      final isRemovePassword =
                          await NfcManagerUtility.removePasswordWithTag(
                              tag: tag);
                      print("isRemovePassword: $isRemovePassword");
                      if (isRemovePassword) {
                        await NfcManager.instance.stopSession(
                            alertMessage: "Password remove successfully ");
                      }
                    });
              },
              child: button(size,
                  color: Colors.orangeAccent,
                  text: 'Password remove ',
                  textColor: Colors.white),
            ),
            InkWell(
              onTap: () async {
                final isRemovePassword = await NfcManager.instance.startSession(
                    alertMessage:
                        'Hold the NFC tag on the upper back of your iPhone',
                    onDiscovered: (NfcTag tag) async {
                      final isSetPassword =
                          await NfcManagerUtility.setPasswordWithTag(
                              tag: tag, password: "1111");
                      print("isSetPassword: $isSetPassword");
                      if (isSetPassword) {
                        await NfcManager.instance.stopSession(
                            alertMessage: "Password set successfully ");
                      }
                    });
              },
              child: button(size,
                  color: Colors.orangeAccent,
                  text: 'Password set',
                  textColor: Colors.white),
            ),
            InkWell(
              onTap: () async {
                final isRemovePassword = await NfcManager.instance.startSession(
                    alertMessage:
                        'Hold the NFC tag on the upper back of your iPhone',
                    onDiscovered: (NfcTag tag) async {
                      final isAuthTag = await NfcManagerUtility.authTag(
                          tag: tag, password: "1111");
                      print("isAuthTag: $isAuthTag");
                      if (isAuthTag) {
                        await NfcManager.instance.stopSession(
                            alertMessage: "Password Auth successfully ");
                      } else {
                        await NfcManager.instance
                            .stopSession(errorMessage: "Password can not auth");
                      }
                    });
              },
              child: button(size,
                  color: Colors.orangeAccent,
                  text: 'Password Auth',
                  textColor: Colors.white),
            ),
          ],
        ),
      ),
    );
  }

  Container button(Size size,
      {required Color color, required Color textColor, required String text}) {
    return Container(
        margin: const EdgeInsets.symmetric(vertical: 10),
        alignment: Alignment.center,
        width: size.width * 0.8,
        padding: EdgeInsets.all(20),
        decoration: BoxDecoration(
            color: color, borderRadius: BorderRadius.circular(20)),
        child: Text(
          "$text".toUpperCase(),
          style: TextStyle(color: textColor),
        ));
  }
}

更多关于Flutter NFC管理插件nfc_manager_new的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NFC管理插件nfc_manager_new的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


nfc_manager_new 是一个用于管理 NFC(近场通信)的 Flutter 插件。它允许开发者在 Flutter 应用中读取和写入 NFC 标签。以下是如何使用 nfc_manager_new 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 nfc_manager_new 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  nfc_manager_new: ^1.0.0  # 使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化 NFC 管理

在你的 Dart 文件中导入 nfc_manager_new 插件并初始化 NFC 管理:

import 'package:nfc_manager_new/nfc_manager_new.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NfcScreen(),
    );
  }
}

class NfcScreen extends StatefulWidget {
  @override
  _NfcScreenState createState() => _NfcScreenState();
}

class _NfcScreenState extends State<NfcScreen> {
  NfcManagerNew nfcManager = NfcManagerNew();

  @override
  void initState() {
    super.initState();
    initNfc();
  }

  void initNfc() async {
    bool isAvailable = await nfcManager.isAvailable();
    if (!isAvailable) {
      print('NFC 不可用');
      return;
    }

    nfcManager.startSession(
      onDiscovered: (NfcTag tag) async {
        print('发现 NFC 标签: $tag');
        // 处理标签数据
      },
      onError: (dynamic error) {
        print('NFC 错误: $error');
      },
      onClose: () {
        print('NFC 会话关闭');
      },
    );
  }

  @override
  void dispose() {
    nfcManager.stopSession();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('NFC 管理'),
      ),
      body: Center(
        child: Text('请将 NFC 标签靠近设备'),
      ),
    );
  }
}

3. 读取 NFC 标签数据

onDiscovered 回调中,你可以读取 NFC 标签的数据。例如,读取 NDEF 消息:

nfcManager.startSession(
  onDiscovered: (NfcTag tag) async {
    if (tag.ndef != null) {
      NdefMessage? ndefMessage = await tag.ndef?.read();
      if (ndefMessage != null) {
        for (var record in ndefMessage.records) {
          print('NDEF 记录: ${record.payload}');
        }
      }
    }
  },
  onError: (dynamic error) {
    print('NFC 错误: $error');
  },
  onClose: () {
    print('NFC 会话关闭');
  },
);

4. 写入 NFC 标签数据

如果你想向 NFC 标签写入数据,可以使用 write 方法。例如,写入一个 NDEF 消息:

nfcManager.startSession(
  onDiscovered: (NfcTag tag) async {
    if (tag.ndef != null) {
      NdefMessage ndefMessage = NdefMessage([
        NdefRecord.createText('Hello, NFC!'),
      ]);
      await tag.ndef?.write(ndefMessage);
      print('数据写入成功');
    }
  },
  onError: (dynamic error) {
    print('NFC 错误: $error');
  },
  onClose: () {
    print('NFC 会话关闭');
  },
);

5. 处理错误和关闭会话

确保在 onError 回调中处理错误,并在 dispose 方法中关闭 NFC 会话。

6. 权限处理

在 Android 上,你需要在 AndroidManifest.xml 中添加 NFC 权限:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

在 iOS 上,你需要在 Info.plist 中添加 NFC 使用描述:

<key>NFCReaderUsageDescription</key>
<string>我们需要使用 NFC 来读取和写入标签</string>
回到顶部