You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
5.8KB

  1. import 'dart:io';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/src/foundation/key.dart';
  5. import 'package:flutter/src/widgets/framework.dart';
  6. import 'package:get/get.dart';
  7. import 'package:qr_code_scanner/qr_code_scanner.dart';
  8. import '../../custom_widgets/widget_utils.dart';
  9. import '../plot_detail/sc_plot_detail.dart';
  10. class ScanQrPage extends StatefulWidget {
  11. const ScanQrPage({Key? key}) : super(key: key);
  12. @override
  13. State<ScanQrPage> createState() => _ScanQrPageState();
  14. }
  15. class _ScanQrPageState extends State<ScanQrPage> {
  16. Barcode? result;
  17. QRViewController? controller;
  18. final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  19. // In order to get hot reload to work we need to pause the camera if the platform
  20. // is android, or resume the camera if the platform is iOS.
  21. @override
  22. void reassemble() {
  23. super.reassemble();
  24. if (Platform.isAndroid) {
  25. controller!.pauseCamera();
  26. }
  27. controller!.resumeCamera();
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return Scaffold(
  32. body: SafeArea(
  33. child: Column(
  34. children: <Widget>[
  35. Expanded(flex: 4, child: _buildQrView(context)),
  36. Expanded(
  37. flex: 1,
  38. child: FittedBox(
  39. fit: BoxFit.contain,
  40. child: Column(
  41. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  42. children: <Widget>[
  43. if (result != null) Text('Barcode Type') else const Text('Scan a code'),
  44. Row(
  45. mainAxisAlignment: MainAxisAlignment.center,
  46. crossAxisAlignment: CrossAxisAlignment.center,
  47. children: <Widget>[
  48. Container(
  49. margin: const EdgeInsets.all(8),
  50. child: ElevatedButton(
  51. onPressed: () async {
  52. await controller?.toggleFlash();
  53. setState(() {});
  54. },
  55. child: FutureBuilder(
  56. future: controller?.getFlashStatus(),
  57. builder: (context, snapshot) {
  58. return Text('Flash: ${snapshot.data}');
  59. },
  60. )),
  61. ),
  62. Container(
  63. margin: const EdgeInsets.all(8),
  64. child: ElevatedButton(
  65. onPressed: () async {
  66. await controller?.flipCamera();
  67. setState(() {});
  68. },
  69. child: FutureBuilder(
  70. future: controller?.getCameraInfo(),
  71. builder: (context, snapshot) {
  72. if (snapshot.data != null) {
  73. return Text('Camera facing ');
  74. } else {
  75. return const Text('loading');
  76. }
  77. },
  78. )),
  79. )
  80. ],
  81. ),
  82. Row(
  83. mainAxisAlignment: MainAxisAlignment.center,
  84. crossAxisAlignment: CrossAxisAlignment.center,
  85. children: <Widget>[
  86. Container(
  87. margin: const EdgeInsets.all(8),
  88. child: ElevatedButton(
  89. onPressed: () async {
  90. await controller?.pauseCamera();
  91. },
  92. child: const Text('pause', style: TextStyle(fontSize: 20)),
  93. ),
  94. ),
  95. Container(
  96. margin: const EdgeInsets.all(8),
  97. child: ElevatedButton(
  98. onPressed: () async {
  99. await controller?.resumeCamera();
  100. },
  101. child: const Text('resume', style: TextStyle(fontSize: 20)),
  102. ),
  103. )
  104. ],
  105. ),
  106. ],
  107. ),
  108. ),
  109. )
  110. ],
  111. ),
  112. ),
  113. );
  114. }
  115. Widget _buildQrView(BuildContext context) {
  116. // For this example we check how width or tall the device is and change the scanArea and overlay accordingly.
  117. var scanArea = (MediaQuery.of(context).size.width < 400 || MediaQuery.of(context).size.height < 400) ? 150.0 : 300.0;
  118. // To ensure the Scanner view is properly sizes after rotation
  119. // we need to listen for Flutter SizeChanged notification and update controller
  120. return QRView(
  121. key: qrKey,
  122. onQRViewCreated: _onQRViewCreated,
  123. overlay: QrScannerOverlayShape(borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: scanArea),
  124. onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p),
  125. );
  126. }
  127. void _onQRViewCreated(QRViewController controller) {
  128. setState(() {
  129. this.controller = controller;
  130. });
  131. controller.scannedDataStream.listen((scanData) {
  132. setState(() {
  133. result = scanData;
  134. });
  135. });
  136. }
  137. void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
  138. if (!p) {
  139. ScaffoldMessenger.of(context).showSnackBar(
  140. const SnackBar(content: Text('no Permission')),
  141. );
  142. }
  143. }
  144. @override
  145. void dispose() {
  146. controller?.dispose();
  147. super.dispose();
  148. }
  149. }