A new flutter plugin to help developers looking to use internal hardware inside iOS or Android devices for reading and writing NFC tags.
The system activate a pooling reading session that stops automatically once a tag has been recognised. You can also trigger the stop event manually using a dedicated function.
Platform | Supported NFC Tags |
---|---|
Android | NDEF: A, B, F, V, BARCODE |
iOS | NDEF: NFC TYPE 1, 2, 3, 4, 5 |
Add to pubspec.yaml:
dependencies: flutter_nfc_reader: ^0.2.0
or to get the experimental one:
dependencies: flutter_nfc_reader:git: url: git://github.com/matteocrippa/flutter-nfc-reader.git ref: develop
and then run the shell
flutter packages get
last step import to the project:
import 'package:flutter_nfc_reader/flutter_nfc_reader.dart';
Add those two lines to your AndroidManifest.xml
on the top
<uses-permission android:name="android.permission.NFC" /> <uses-featureandroid:name="android.hardware.nfc"android:required="true" />
Assign 19 in minSdkVersion in the build.gradle (Module: app)
defaultConfig {... minSdkVersion 19... }
Atm only Swift
based Flutter project are supported.
Enable Capabilities / Near Field Communication Tag Reading.
Info.plist file, add Privacy - NFC Scan Usage Description with string value NFC Tag.
In your Podfile add this code in the top
platform :ios, '8.0'use_frameworks!
This function will return a promise when a read occurs, till that very moment the reading session is open.
The promise will return a NfcData
model, this model contains:
FlutterNfcReader.read()
and FlutterNfcReader.onTagDiscovered()
have an optional parameter, only for iOS, called instruction
.
You can pass a String that contains information to be shown in the modal screen.
id > id of the tag
content > content of the tag
error > if any error occurs
FlutterNfcReader.read().then((response) {print(response.content); });
this function will return a Stream that emits NfcData
everytime a tag is recognized. On Ios you can use this too but IOS will always show a bottom sheet when it wants to scan a NFC Tag. Therefore you need to explicitly cast FlutterNfcReader.read()
when you expect a second value. When subscribing to the stream the read function is called a first time for you. View the Example for a sample implementation.
FlutterNfcReader.onTagDiscovered().listen((onData) { print(onData.id); print(onData.content); });
This function will return a promise when a write occurs, till that very moment the reading session is open.
The promise will return a NfcData
model, this model contains:
content > writed in the tag
FlutterNfcReader.write("path_prefix","tag content").then((response) {print(response.content); });
You can read and then write in an nfc tag using the above functions as follows
FlutterNfcReader.read().then((readResponse) {FlutterNfcReader.write(" ",readResponse.content).then((writeResponse) {print('writed: ${writeResponse.content}'); }); });
status > status of ncf reading or writing stoped
FlutterNfcReader.stop().then((response) {print(response.status.toString()); });
For better details look at the demo app.
In order to check whether the Device supports NFC or not you can call FlutterNfcReader.checkNFCAvailability()
.
The method returns NFCAvailability.available
when NFC is supported and enabled, NFCAvailability.disabled
when NFC is disabled (Android only) and NFCAvailability.not_supported
when the user's hardware does not support NFC.
IOS behaves a bit different in terms of NFC Scanning and writing.
Ids of the tags aren't possible in the current implementation
each scan is visible for the user with a bottom sheet
For help getting started with Flutter, view our online documentation.
For help on editing plugin code, view the documentation.
Please take a quick look at the contribution guidelines first. If you see a package or project here that is no longer maintained or is not a good fit, please submit a pull request to improve this file. Thank you to all contributors!!
to develop on ios you need to activate the "legacy" build system because of this issue in flutter:
flutter/flutter#20685