Flutter NFC读写插件flutter_nfc_acs2的使用

Flutter NFC 读写插件 flutter_nfc_acs2 的使用

简介

flutter_nfc_acs2 是一个用于 Flutter 应用程序的 NFC 插件。它支持通过 Android 和 iOS 设备上的 NFC 功能与 NFC 标签进行交互。

开始使用

安装依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_nfc_acs2: ^x.x.x # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

示例代码

以下是一个简单的示例代码,展示了如何使用 flutter_nfc_acs2 插件来发现 NFC 设备并与其进行连接。

主文件 (main.dart)

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

import 'package:flutter_nfc_acs2/flutter_nfc_acs.dart';
import 'package:flutter_nfc_acs2/models.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter NFC ACS'),
        ),
        body: StreamBuilder<List<AcsDevice>>(
          stream: FlutterNfcAcs.devices.map((d) =>
              (d.where((asc) => (asc.name?.indexOf('ACR') ?? -1) != -1))
                  .toList()),
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              print(snapshot.error);
              return Text('Error');
            } else if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, i) {
                  final item = snapshot.data[i];
                  return RaisedButton(
                    key: ValueKey(item.address),
                    child:
                        Text((item.name ?? 'No name') + ' -- ' + item.address),
                    onPressed: () => Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => DeviceRoute(device: item),
                      ),
                    ),
                  );
                },
              );
            } else {
              return Text('No data yet');
            }
          },
        ),
      ),
    );
  }
}

class DeviceRoute extends StatefulWidget {
  const DeviceRoute({Key key, this.device}) : super(key: key);

  final AcsDevice device;

  @override
  _DeviceRouteState createState() => _DeviceRouteState();
}

class _DeviceRouteState extends State<DeviceRoute> {
  String connection = FlutterNfcAcs.DISCONNECTED;
  String error;
  StreamSubscription _sub;

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

    FlutterNfcAcs.connect(widget.device.address)
        .catchError((err) => setState(() => error = err));

    _sub = FlutterNfcAcs.connectionStatus.listen((status) {
      setState(() {
        connection = status;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            RaisedButton(
              child: Text(connection == FlutterNfcAcs.DISCONNECTED
                  ? 'Connect'
                  : 'Disconnect'),
              onPressed: () => connection == FlutterNfcAcs.DISCONNECTED
                  ? FlutterNfcAcs.connect(widget.device.address)
                      .catchError((err) => setState(() => error = err))
                  : FlutterNfcAcs.disconnect(),
            ),
            Text(widget.device?.name ?? 'No name'),
            StreamBuilder<int>(
              stream: FlutterNfcAcs.batteryStatus,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.active)
                  return Text('Battery level: ' + snapshot.data.toString());
                else
                  return const SizedBox.shrink();
              },
            ),
            StreamBuilder<String>(
              stream: FlutterNfcAcs.cards,
              builder: (context, snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                    return Text('Card: no connection');
                    break;
                  case ConnectionState.waiting:
                    return Text('Card: waiting');
                    break;
                  case ConnectionState.active:
                    return Text('Card: ' + snapshot.data.toString());
                    break;
                  case ConnectionState.done:
                    return Text('Card: done');
                    break;
                  default:
                    return Text('Card: unknown state');
                }
              },
            ),
            StreamBuilder<String>(
              stream: FlutterNfcAcs.connectionStatus,
              builder: (context, snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                    return Text('Connection: nope');
                    break;
                  case ConnectionState.waiting:
                    return Text('Connection: waiting');
                    break;
                  case ConnectionState.active:
                    return Text('Connection: ' + snapshot.data.toString());
                    break;
                  case ConnectionState.done:
                    return Text('Connection: done');
                    break;
                  default:
                    return Text('Connection: unknown state');
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _sub?.cancel();
    FlutterNfcAcs.disconnect();
    super.dispose();
  }
}

代码解释

  1. 导入依赖

    import 'package:flutter_nfc_acs2/flutter_nfc_acs.dart';
    import 'package:flutter_nfc_acs2/models.dart';
    
  2. 主应用类

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
  3. 构建 UI

    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Flutter NFC ACS'),
            ),
            body: StreamBuilder<List<AcsDevice>>(
              stream: FlutterNfcAcs.devices.map((d) =>
                  (d.where((asc) => (asc.name?.indexOf('ACR') ?? -1) != -1))
                      .toList()),
              builder: (context, snapshot) {
                // 处理数据和错误
              },
            ),
          ),
        );
      }
    }
    
  4. 设备路由类

    class DeviceRoute extends StatefulWidget {
      const DeviceRoute({Key key, this.device}) : super(key: key);
    
      final AcsDevice device;
    
      @override
      _DeviceRouteState createState() => _DeviceRouteState();
    }
    
  5. 设备状态处理

    class _DeviceRouteState extends State<DeviceRoute> {
      String connection = FlutterNfcAcs.DISCONNECTED;
      String error;
      StreamSubscription _sub;
    
      @override
      void initState() {
        super.initState();
    
        FlutterNfcAcs.connect(widget.device.address)
            .catchError((err) => setState(() => error = err));
    
        _sub = FlutterNfcAcs.connectionStatus.listen((status) {
          setState(() {
            connection = status;
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                RaisedButton(
                  child: Text(connection == FlutterNfcAcs.DISCONNECTED
                      ? 'Connect'
                      : 'Disconnect'),
                  onPressed: () => connection == FlutterNfcAcs.DISCONNECTED
                      ? FlutterNfcAcs.connect(widget.device.address)
                          .catchError((err) => setState(() => error = err))
                      : FlutterNfcAcs.disconnect(),
                ),
                Text(widget.device?.name ?? 'No name'),
                // 显示电池状态等信息
              ],
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        _sub?.cancel();
        FlutterNfcAcs.disconnect();
        super.dispose();
      }
    }
    

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

1 回复

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


当然,关于flutter_nfc_acs2这个Flutter插件的使用,下面是一个基本的代码示例,展示了如何使用该插件进行NFC卡的读写操作。请注意,flutter_nfc_acs2是一个特定于ACS ACR122U NFC阅读器的插件,因此确保你的硬件环境支持该阅读器。

首先,你需要在pubspec.yaml文件中添加flutter_nfc_acs2依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_nfc_acs2: ^最新版本号  # 请替换为实际发布的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中编写代码来初始化NFC阅读器并进行读写操作。以下是一个基本的示例:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  NfcAcs2? _nfcAcs2;
  String _status = "NFC未初始化";
  String _cardData = "";

  @override
  void initState() {
    super.initState();
    // 初始化NFC阅读器
    _nfcAcs2 = NfcAcs2();
    _nfcAcs2!.initialize().then((success) {
      setState(() {
        _status = success ? "NFC已初始化" : "NFC初始化失败";
      });
      // 开始监听卡片
      _nfcAcs2!.startNfcListener().listen((NfcCard? card) {
        if (card != null) {
          // 读取卡片数据
          _nfcAcs2!.readCard(card.uid).then((data) {
            setState(() {
              _cardData = String.fromCharCodes(data);
            });
          });
        }
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter NFC ACS2 示例'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('状态: $_status'),
              SizedBox(height: 16),
              Text('卡片数据: $_cardData'),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 停止NFC监听并释放资源
    _nfcAcs2?.stopNfcListener();
    _nfcAcs2?.dispose();
    super.dispose();
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml中添加了flutter_nfc_acs2依赖。
  2. MyApp组件的initState方法中初始化了NFC阅读器,并开始监听NFC卡片。
  3. 当检测到NFC卡片时,读取卡片数据并显示在界面上。
  4. dispose方法中停止NFC监听并释放资源。

请注意,这个示例假设你已经正确连接了ACS ACR122U NFC阅读器,并且你的设备支持NFC操作。此外,实际使用中你可能需要根据具体需求对代码进行调整,比如处理不同类型的NFC卡片或添加错误处理逻辑。

由于flutter_nfc_acs2是一个特定硬件的插件,确保你的开发环境和硬件设备满足插件的要求。如果遇到任何问题,请参考插件的官方文档或GitHub仓库以获取更多信息和支持。

回到顶部