scan_camera_dialog.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import 'package:flutter/material.dart';
  2. import 'package:permission_handler/permission_handler.dart';
  3. import 'package:r_scan_example/scan_dialog.dart';
  4. import 'package:r_scan/src/r_scan_camera.dart';
  5. List<RScanCameraDescription> rScanCameras;
  6. class RScanCameraDialog extends StatefulWidget {
  7. @override
  8. _RScanCameraDialogState createState() => _RScanCameraDialogState();
  9. }
  10. class _RScanCameraDialogState extends State<RScanCameraDialog> {
  11. RScanCameraController _controller;
  12. bool isFirst = true;
  13. void initCamera() async {
  14. if (rScanCameras == null || rScanCameras.length == 0) {
  15. final result = await PermissionHandler()
  16. .checkPermissionStatus(PermissionGroup.camera);
  17. if (result == PermissionStatus.granted) {
  18. rScanCameras = await availableRScanCameras();
  19. print('返回可用的相机:${rScanCameras.join('\n')}');
  20. } else {
  21. final resultMap = await PermissionHandler()
  22. .requestPermissions([PermissionGroup.camera]);
  23. if (resultMap[PermissionGroup.camera] == PermissionStatus.granted) {
  24. rScanCameras = await availableRScanCameras();
  25. } else {
  26. print('相机权限被拒绝,无法使用');
  27. }
  28. }
  29. }
  30. if (rScanCameras != null && rScanCameras.length > 0) {
  31. _controller = RScanCameraController(
  32. rScanCameras[0], RScanCameraResolutionPreset.high)
  33. ..addListener(() {
  34. final result = _controller.result;
  35. if (result != null) {
  36. if (isFirst) {
  37. Navigator.of(context).pop(result);
  38. isFirst = false;
  39. }
  40. }
  41. })
  42. ..initialize().then((_) {
  43. if (!mounted) {
  44. return;
  45. }
  46. setState(() {});
  47. });
  48. }
  49. }
  50. @override
  51. void initState() {
  52. super.initState();
  53. initCamera();
  54. }
  55. @override
  56. void dispose() {
  57. _controller?.dispose();
  58. super.dispose();
  59. }
  60. @override
  61. Widget build(BuildContext context) {
  62. if (rScanCameras == null || rScanCameras.length == 0) {
  63. return Scaffold(
  64. body: Container(
  65. alignment: Alignment.center,
  66. child: Text('not have available camera'),
  67. ),
  68. );
  69. }
  70. if (!_controller.value.isInitialized) {
  71. return Container();
  72. }
  73. return Scaffold(
  74. backgroundColor: Colors.black,
  75. body: Stack(
  76. children: <Widget>[
  77. ScanImageView(
  78. child: AspectRatio(
  79. aspectRatio: _controller.value.aspectRatio,
  80. child: RScanCamera(_controller),
  81. ),
  82. ),
  83. Align(
  84. alignment: Alignment.bottomCenter,
  85. child: FutureBuilder(
  86. future: getFlashMode(),
  87. builder: _buildFlashBtn,
  88. ))
  89. ],
  90. ),
  91. );
  92. }
  93. Future<bool> getFlashMode() async {
  94. bool isOpen = false;
  95. try {
  96. isOpen = await _controller.getFlashMode();
  97. } catch (_) {}
  98. return isOpen;
  99. }
  100. Widget _buildFlashBtn(BuildContext context, AsyncSnapshot<bool> snapshot) {
  101. return snapshot.hasData
  102. ? Padding(
  103. padding: EdgeInsets.only(
  104. bottom: 24 + MediaQuery.of(context).padding.bottom),
  105. child: IconButton(
  106. icon: Icon(snapshot.data ? Icons.flash_on : Icons.flash_off),
  107. color: Colors.white,
  108. iconSize: 46,
  109. onPressed: () {
  110. if (snapshot.data) {
  111. _controller.setFlashMode(false);
  112. } else {
  113. _controller.setFlashMode(true);
  114. }
  115. setState(() {});
  116. }),
  117. )
  118. : Container();
  119. }
  120. }