diff --git a/lib/views/public/scan_page.dart b/lib/views/public/scan_page.dart index be1c42a..5b74ffd 100644 --- a/lib/views/public/scan_page.dart +++ b/lib/views/public/scan_page.dart @@ -1,4 +1,10 @@ +import 'package:chat/configs/app_colors.dart'; +import 'package:chat/routes/user_routes.dart'; +import 'package:chat/utils/ui_tools.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:scan/scan.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; class ScanPage extends StatefulWidget { const ScanPage({Key? key}) : super(key: key); @@ -8,11 +14,130 @@ class ScanPage extends StatefulWidget { } class _ScanPageState extends State { + final ScanController _scanController = ScanController(); + + bool flashState = false; + + /// 统一处理扫码结果,可能是扫码的,也可能是相册的 + void parseScanResult(String str) { + List split = str.split('|'); + + switch (split.first) { + case 'TRANSFER': + // 处理扫码转账 + Get.back(result: split.last); + break; + case 'BEFRIEND': + // 加好友 + break; + case 'JOINGROUP': + // 加群 + break; + default: + UiTools.toast(str); + } + } + @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('扫一扫'), + return Stack( + children: [ + ScanView( + controller: _scanController, + scanAreaScale: 0.7, + scanLineColor: AppColors.primary, + onCapture: (String data) { + parseScanResult(data); + }, + ), + AppBar( + backgroundColor: AppColors.transparent, + foregroundColor: AppColors.white, + ), + Positioned( + left: 16, + right: 16, + bottom: 32, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _actionItem( + '我的', + Icons.qr_code, + () { + Get.toNamed(UserRoutes.qrCode); + }, + ), + _actionItem( + '手电筒', + flashState ? Icons.flash_on : Icons.flash_off, + () { + setState(() { + _scanController.toggleTorchMode(); + flashState = !flashState; + }); + }, + ), + _actionItem( + '相册', + Icons.image, + () async { + final result = await AssetPicker.pickAssets( + Get.context!, + pickerConfig: const AssetPickerConfig( + maxAssets: 1, + requestType: RequestType.image, + ), + ); + + if (result == null) { + return; + } + + var text = await Scan.parse((await result.first.file)!.path); + + if (text == null) { + UiTools.toast('二维码识别失败'); + } + + parseScanResult(text!); + }, + ), + ], + ), + ), + ], + ); + } + + Widget _actionItem(String text, IconData icon, VoidCallback onTap) { + return InkWell( + onTap: () { + onTap.call(); + }, + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: AppColors.white.withOpacity(0.4), + borderRadius: BorderRadius.circular(32), + ), + child: Icon( + icon, + color: AppColors.white, + size: 24, + ), + ), + const SizedBox(height: 4), + Text( + text, + style: const TextStyle( + color: AppColors.white, + fontSize: 12, + ), + ), + ], ), ); }