You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
		
		
			
		
	
	
			213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
| 
								 
											2 months ago
										 
									 | 
							
								import 'dart:io';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import 'package:easy_localization/easy_localization.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter/material.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter_nfc_kit/flutter_nfc_kit.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter_svg/flutter_svg.dart';
							 | 
						||
| 
								 | 
							
								import 'package:hmg_patient_app_new/core/app_assets.dart';
							 | 
						||
| 
								 | 
							
								import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
							 | 
						||
| 
								 | 
							
								import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
							 | 
						||
| 
								 | 
							
								import 'package:hmg_patient_app_new/theme/colors.dart';
							 | 
						||
| 
								 | 
							
								import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void showNfcReader(BuildContext context, {required Function onNcfScan, required VoidCallback onCancel}) {
							 | 
						||
| 
								 | 
							
								  showModalBottomSheet(
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      enableDrag: false,
							 | 
						||
| 
								 | 
							
								      isDismissible: true,
							 | 
						||
| 
								 | 
							
								      shape: RoundedRectangleBorder(
							 | 
						||
| 
								 | 
							
								        borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)),
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								      backgroundColor: Colors.white,
							 | 
						||
| 
								 | 
							
								      builder: (context) {
							 | 
						||
| 
								 | 
							
								        return NfcLayout(
							 | 
						||
| 
								 | 
							
								          onNcfScan: onNcfScan,
							 | 
						||
| 
								 | 
							
								          onCancel: onCancel,
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class NfcLayout extends StatefulWidget {
							 | 
						||
| 
								 | 
							
								  Function? onNcfScan;
							 | 
						||
| 
								 | 
							
								  VoidCallback? onCancel;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  NfcLayout({this.onNcfScan, this.onCancel});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  _NfcLayoutState createState() => _NfcLayoutState();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class _NfcLayoutState extends State<NfcLayout> {
							 | 
						||
| 
								 | 
							
								  bool _reading = false;
							 | 
						||
| 
								 | 
							
								  Widget? mainWidget;
							 | 
						||
| 
								 | 
							
								  late String nfcId;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  void initState() {
							 | 
						||
| 
								 | 
							
								    super.initState();
							 | 
						||
| 
								 | 
							
								    readNFC();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void readNFC() async {
							 | 
						||
| 
								 | 
							
								    FlutterNfcKit.finish();
							 | 
						||
| 
								 | 
							
								    FlutterNfcKit.poll(timeout: Duration(seconds: 10), androidPlatformSound: true, androidCheckNDEF: false, iosMultipleTagMessage: "Multiple tags found!").then((value) async {
							 | 
						||
| 
								 | 
							
								      setState(() {
							 | 
						||
| 
								 | 
							
								        _reading = true;
							 | 
						||
| 
								 | 
							
								        mainWidget = doneNfc();
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      Future.delayed(const Duration(milliseconds: 500), () async {
							 | 
						||
| 
								 | 
							
								        await FlutterNfcKit.finish();
							 | 
						||
| 
								 | 
							
								        widget.onNcfScan!(nfcId);
							 | 
						||
| 
								 | 
							
								        Navigator.pop(context);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      nfcId = value.id;
							 | 
						||
| 
								 | 
							
								    }).catchError((err) {
							 | 
						||
| 
								 | 
							
								      print(err);
							 | 
						||
| 
								 | 
							
								      Navigator.of(context).pop();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  Widget build(BuildContext context) {
							 | 
						||
| 
								 | 
							
								    // return SizedBox();
							 | 
						||
| 
								 | 
							
								    (mainWidget == null && !_reading) ? mainWidget = scanNfc() : mainWidget = doneNfc();
							 | 
						||
| 
								 | 
							
								    return Platform.isAndroid ? AnimatedSwitcher(duration: Duration(milliseconds: 500), child: mainWidget) : SizedBox.shrink();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Widget scanNfc() {
							 | 
						||
| 
								 | 
							
								    return Container(
							 | 
						||
| 
								 | 
							
								      key: ValueKey(1),
							 | 
						||
| 
								 | 
							
								      child: Column(
							 | 
						||
| 
								 | 
							
								        mainAxisSize: MainAxisSize.min,
							 | 
						||
| 
								 | 
							
								        children: <Widget>[
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          Text(
							 | 
						||
| 
								 | 
							
								            "Ready To Scan",
							 | 
						||
| 
								 | 
							
								            style: TextStyle(
							 | 
						||
| 
								 | 
							
								              fontWeight: FontWeight.bold,
							 | 
						||
| 
								 | 
							
								              fontSize: 24,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SvgPicture.asset(
							 | 
						||
| 
								 | 
							
								            "assets/images/nfc/contactless.svg",
							 | 
						||
| 
								 | 
							
								            height: MediaQuery.of(context).size.width / 3,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          Text(
							 | 
						||
| 
								 | 
							
								            "Approach an NFC Tag",
							 | 
						||
| 
								 | 
							
								            style: TextStyle(
							 | 
						||
| 
								 | 
							
								              fontSize: 18,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          ButtonTheme(
							 | 
						||
| 
								 | 
							
								            minWidth: MediaQuery.of(context).size.width / 1.2,
							 | 
						||
| 
								 | 
							
								            height: 45.0,
							 | 
						||
| 
								 | 
							
								            buttonColor: Colors.grey[300],
							 | 
						||
| 
								 | 
							
								            shape: RoundedRectangleBorder(
							 | 
						||
| 
								 | 
							
								              borderRadius: BorderRadius.circular(6),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								            child: CustomButton(
							 | 
						||
| 
								 | 
							
								              text: LocaleKeys.cancel.tr(),
							 | 
						||
| 
								 | 
							
								              onPressed: () {
							 | 
						||
| 
								 | 
							
								                widget.onCancel!();
							 | 
						||
| 
								 | 
							
								                Navigator.pop(context);
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              backgroundColor: AppColors.primaryRedColor,
							 | 
						||
| 
								 | 
							
								              borderColor: AppColors.primaryRedColor,
							 | 
						||
| 
								 | 
							
								              textColor: AppColors.whiteColor,
							 | 
						||
| 
								 | 
							
								              fontSize: 14,
							 | 
						||
| 
								 | 
							
								              fontWeight: FontWeight.w500,
							 | 
						||
| 
								 | 
							
								              borderRadius: 12.h,
							 | 
						||
| 
								 | 
							
								              height: 40.h,
							 | 
						||
| 
								 | 
							
								              icon: AppAssets.cancel,
							 | 
						||
| 
								 | 
							
								              iconColor: AppColors.whiteColor,
							 | 
						||
| 
								 | 
							
								              iconSize: 16.h,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Widget doneNfc() {
							 | 
						||
| 
								 | 
							
								    return Container(
							 | 
						||
| 
								 | 
							
								      key: ValueKey(2),
							 | 
						||
| 
								 | 
							
								      child: Column(
							 | 
						||
| 
								 | 
							
								        mainAxisSize: MainAxisSize.min,
							 | 
						||
| 
								 | 
							
								        children: <Widget>[
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          Text(
							 | 
						||
| 
								 | 
							
								            "Successfully Scanned",
							 | 
						||
| 
								 | 
							
								            style: TextStyle(
							 | 
						||
| 
								 | 
							
								              fontWeight: FontWeight.bold,
							 | 
						||
| 
								 | 
							
								              fontSize: 24,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          Image.asset(
							 | 
						||
| 
								 | 
							
								            "assets/images/nfc/ic_done.png",
							 | 
						||
| 
								 | 
							
								            height: MediaQuery.of(context).size.width / 3,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          Text(
							 | 
						||
| 
								 | 
							
								            "Approach an NFC Tag",
							 | 
						||
| 
								 | 
							
								            style: TextStyle(
							 | 
						||
| 
								 | 
							
								              fontSize: 18,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          ButtonTheme(
							 | 
						||
| 
								 | 
							
								            minWidth: MediaQuery.of(context).size.width / 1.2,
							 | 
						||
| 
								 | 
							
								            height: 45.0,
							 | 
						||
| 
								 | 
							
								            buttonColor: Colors.grey[300],
							 | 
						||
| 
								 | 
							
								            shape: RoundedRectangleBorder(
							 | 
						||
| 
								 | 
							
								              borderRadius: BorderRadius.circular(6),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								            child: CustomButton(
							 | 
						||
| 
								 | 
							
								              text: LocaleKeys.done.tr(),
							 | 
						||
| 
								 | 
							
								              onPressed: () {
							 | 
						||
| 
								 | 
							
								                widget.onCancel!();
							 | 
						||
| 
								 | 
							
								                Navigator.pop(context);
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              backgroundColor: AppColors.primaryRedColor,
							 | 
						||
| 
								 | 
							
								              borderColor: AppColors.primaryRedColor,
							 | 
						||
| 
								 | 
							
								              textColor: AppColors.whiteColor,
							 | 
						||
| 
								 | 
							
								              fontSize: 14,
							 | 
						||
| 
								 | 
							
								              fontWeight: FontWeight.w500,
							 | 
						||
| 
								 | 
							
								              borderRadius: 12.h,
							 | 
						||
| 
								 | 
							
								              height: 40.h,
							 | 
						||
| 
								 | 
							
								              icon: AppAssets.cancel,
							 | 
						||
| 
								 | 
							
								              iconColor: AppColors.whiteColor,
							 | 
						||
| 
								 | 
							
								              iconSize: 16.h,
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          SizedBox(
							 | 
						||
| 
								 | 
							
								            height: 30,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |