view.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import 'package:camera/camera.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'index.dart';
  5. import 'widgets/widgets.dart';
  6. // import 'package:video_player/video_player.dart';
  7. class IdCardScanPage extends GetView<IdCardScanController> {
  8. const IdCardScanPage({Key? key}) : super(key: key);
  9. @override
  10. Widget build(BuildContext context) {
  11. return GetBuilder<IdCardScanController>(
  12. init: IdCardScanController(),
  13. builder: (_) {
  14. return Scaffold(
  15. appBar: AppBar(title: const Text("身份识别建档")),
  16. body: SafeArea(
  17. child: Obx(
  18. () => controller.state.isCameraReady
  19. ? _buildCameraArea()
  20. // ? CameraTestPage(
  21. // cameras: controller.cameras,
  22. // )
  23. : const Center(
  24. child: CircularProgressIndicator(
  25. valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
  26. ),
  27. ),
  28. ),
  29. ),
  30. );
  31. },
  32. );
  33. }
  34. Widget _buildCameraArea() {
  35. return Row(
  36. children: [
  37. const IdCardInfo(),
  38. Expanded(
  39. child: ClipRRect(
  40. child: LayoutBuilder(builder: (context, constraints) {
  41. return Stack(
  42. children: <Widget>[
  43. OverflowBox(
  44. maxHeight: constraints.maxHeight,
  45. maxWidth: 2000,
  46. child: Container(
  47. color: Colors.black,
  48. child: Center(
  49. child: _cameraPreviewWidget(),
  50. ),
  51. ),
  52. ),
  53. Center(
  54. child: Stack(
  55. children: [
  56. Align(
  57. alignment: Alignment.centerLeft,
  58. child: _idCardInfoSwitch(),
  59. ),
  60. if (controller.state.isInIdCardScan)
  61. const CameraForFace()
  62. else
  63. const CameraForIdCard(),
  64. ],
  65. ),
  66. ),
  67. ],
  68. );
  69. }),
  70. ),
  71. ),
  72. ],
  73. );
  74. }
  75. /// 相机预览
  76. Widget _cameraPreviewWidget() {
  77. final CameraController? cameraController = controller.kCameraController;
  78. if (cameraController == null || !cameraController.value.isInitialized) {
  79. /// 旋转loading
  80. return const Center(
  81. child: CircularProgressIndicator(),
  82. );
  83. } else {
  84. return Listener(
  85. onPointerDown: (_) => controller.pointers++,
  86. onPointerUp: (_) => controller.pointers--,
  87. child: CameraPreview(
  88. cameraController,
  89. child: LayoutBuilder(
  90. builder: (BuildContext context, BoxConstraints constraints) {
  91. return GestureDetector(
  92. behavior: HitTestBehavior.opaque,
  93. onScaleStart: controller.handleScaleStart,
  94. onScaleUpdate: controller.handleScaleUpdate,
  95. onTapDown: (TapDownDetails details) =>
  96. controller.onViewFinderTap(details, constraints),
  97. child: const FaceBoundingBox(),
  98. );
  99. },
  100. ),
  101. ),
  102. );
  103. }
  104. }
  105. /// 身份证信息开关
  106. Widget _idCardInfoSwitch() {
  107. return Obx(
  108. () {
  109. if (!controller.state.isShowIdCardInfoSwitch) {
  110. return Container();
  111. }
  112. return Container(
  113. height: 80,
  114. width: 40,
  115. color: Colors.black.withOpacity(0.5),
  116. child: IconButton(
  117. onPressed: () {
  118. controller.state.isIdCardInfoShow =
  119. !controller.state.isIdCardInfoShow;
  120. },
  121. padding: const EdgeInsets.all(0),
  122. icon: Icon(
  123. controller.state.isIdCardInfoShow
  124. ? Icons.keyboard_double_arrow_left
  125. : Icons.keyboard_double_arrow_right,
  126. size: 30),
  127. color: Colors.white,
  128. ),
  129. );
  130. },
  131. );
  132. }
  133. }