From 3677f8b064609533f9e9237a7e7cba8b1cedad05 Mon Sep 17 00:00:00 2001 From: zhangmeng <494089941@qq.com> Date: Thu, 22 Apr 2021 18:03:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=EF=BC=9A=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=8E=A5=E5=8F=A3=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=89=AB=E7=A0=81=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/constants/api_v2.dart | 3 + lib/manager/http_manager.dart | 2 +- lib/models/scan_result_model.dart | 93 ++++++++++ .../home/barcode/qr_scaner_result_page.dart | 169 +++++++++++++++++- lib/pages/home/home_page.dart | 2 +- lib/widgets/barcodeScan.dart | 19 +- 6 files changed, 272 insertions(+), 16 deletions(-) create mode 100644 lib/models/scan_result_model.dart diff --git a/lib/constants/api_v2.dart b/lib/constants/api_v2.dart index 1e6c5d7..e018cb2 100644 --- a/lib/constants/api_v2.dart +++ b/lib/constants/api_v2.dart @@ -93,6 +93,9 @@ class UserAPI { String get securePhone => '/v2/app/user/secret'; String get userSaleAmount => '/v2/app/user/sale'; + + ///二维码扫描 + String get getScanResult => '/v2/app/operate/scan'; } class BenefitAPI { diff --git a/lib/manager/http_manager.dart b/lib/manager/http_manager.dart index f4176f3..5d404a7 100644 --- a/lib/manager/http_manager.dart +++ b/lib/manager/http_manager.dart @@ -181,7 +181,7 @@ class HttpManager { response = await dio.request(url, data: encryptParams, options: option); } on DioError catch (e) { - LoggerData.addData(e); + LoggerData.addData(e..requestOptions.data=params); Response errorResponse; if (e.response != null) { errorResponse = e.response; diff --git a/lib/models/scan_result_model.dart b/lib/models/scan_result_model.dart new file mode 100644 index 0000000..e45d1e1 --- /dev/null +++ b/lib/models/scan_result_model.dart @@ -0,0 +1,93 @@ +import 'dart:convert'; + +/// modela ==modelb +class ScanResultModel { + final int skuID; + final String skuCode; + final String skuName; + final String brandName; + final String brandImg; + final String goodsName; + final num discount; + final num commission; + final String goodsImg; + + ScanResultModel( + this.skuID, + this.skuCode, + this.skuName, + this.brandName, + this.brandImg, + this.goodsName, + this.discount, + this.commission, + this.goodsImg, + ); + + Map toMap() { + return { + 'skuID': skuID, + 'skuCode': skuCode, + 'skuName': skuName, + 'brandName': brandName, + 'brandImg': brandImg, + 'goodsName': goodsName, + 'discount': discount, + 'commission': commission, + 'goodsImg': goodsImg, + }; + } + + factory ScanResultModel.fromMap(Map map) { + return ScanResultModel( + map['skuID'], + map['skuCode'], + map['skuName'], + map['brandName'], + map['brandImg'], + map['goodsName'], + map['discount'], + map['commission'], + map['goodsImg'], + ); + } + + String toJson() => json.encode(toMap()); + + factory ScanResultModel.fromJson(String source) => + ScanResultModel.fromMap(json.decode(source)); + + @override + String toString() { + return 'ScanResultModel(skuID: $skuID, skuCode: $skuCode, skuName: $skuName, brandName: $brandName, brandImg: $brandImg, goodsName: $goodsName, discount: $discount, commission: $commission, goodsImg: $goodsImg)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ScanResultModel && + other.skuID == skuID && + other.skuCode == skuCode && + other.skuName == skuName && + other.brandName == brandName && + other.brandImg == brandImg && + other.goodsName == goodsName && + other.discount == discount && + other.commission == commission && + other.goodsImg == goodsImg; + } + + @override + int get hashCode { + return skuID.hashCode ^ + skuCode.hashCode ^ + skuName.hashCode ^ + brandName.hashCode ^ + brandImg.hashCode ^ + goodsName.hashCode ^ + discount.hashCode ^ + commission.hashCode ^ + goodsImg.hashCode; + } +} diff --git a/lib/pages/home/barcode/qr_scaner_result_page.dart b/lib/pages/home/barcode/qr_scaner_result_page.dart index 7fe5bbd..5395aa9 100644 --- a/lib/pages/home/barcode/qr_scaner_result_page.dart +++ b/lib/pages/home/barcode/qr_scaner_result_page.dart @@ -1,29 +1,62 @@ import 'package:flutter/material.dart'; -import 'package:recook/constants/constants.dart'; +import 'package:recook/constants/api_v2.dart'; +import 'package:recook/manager/http_manager.dart'; +import 'package:recook/models/scan_result_model.dart'; +import 'package:recook/pages/home/widget/plus_minus_view.dart'; import 'package:recook/widgets/custom_image_button.dart'; +import 'package:recook/widgets/progress/re_toast.dart'; import 'package:recook/widgets/recook/recook_scaffold.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:recook/widgets/refresh_widget.dart'; import 'package:velocity_x/velocity_x.dart'; +import 'package:recook/const/resource.dart'; class QRScarerResultPage extends StatefulWidget { - QRScarerResultPage({Key key}) : super(key: key); + final String code; + QRScarerResultPage({Key key, this.code}) : super(key: key); @override _QRScarerResultPageState createState() => _QRScarerResultPageState(); } class _QRScarerResultPageState extends State { + ScanResultModel _scanResultModel; + bool _onload = true; + GSRefreshController _refreshController; + int _goodsCount = 1; @override - void initState() { + void initState() { super.initState(); - + _refreshController = GSRefreshController(initialRefresh: true); } + + @override + void dispose() { + super.dispose(); + _refreshController?.dispose(); + } + @override Widget build(BuildContext context) { return RecookScaffold( title: '扫码购物', - body: ListView( - children: [], + body: RefreshWidget( + controller: _refreshController, + onRefresh: () async { + _scanResultModel = await _getScanModel(); + if (_scanResultModel != null) { + _onload = false; + } else { + ReToast.err(text: '未获取数据'); + } + setState(() {}); + }, + body: _onload + ? emptyWidget() + : ListView( + padding: EdgeInsets.symmetric(vertical: 22.w, horizontal: 20.w), + children: [_goodsCard(_scanResultModel)], + ), ), bottomNavi: Row( children: [_shopButton().expand(), 2.widthBox, _buyButton().expand()], @@ -38,6 +71,130 @@ class _QRScarerResultPageState extends State { ); } + Widget _goodsCard(ScanResultModel model) { + return Column( + children: [ + Row( + children: [ + FadeInImage.assetNetwork( + placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG, + image: model.brandImg, + width: 44.w, + height: 44.w, + ), + 20.w.widthBox, + model.brandName.text + .size(28.sp) + .color(Color(0xFF0A0001)) + .bold + .make(), + ], + ), + 26.w.heightBox, + Row( + children: [ + FadeInImage.assetNetwork( + placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG, + image: model.brandImg, + width: 200.w, + height: 200.w, + fit: BoxFit.contain, + ), + 20.w.widthBox, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + model.goodsName.text + .size(28.sp) + .bold + .color(Color(0xFF141414)) + .maxLines(2) + .overflow(TextOverflow.ellipsis) + .make(), + 10.w.heightBox, + Container( + decoration: BoxDecoration( + color: Color(0xFFEFF1F6), + borderRadius: BorderRadius.circular(4.w)), + padding: EdgeInsets.all(10.w), + child: '${model.skuName}' + .text + .color(Color(0xFF666666)) + .size(20.sp) + .make(), + ), + 30.w.heightBox, + Row( + children: [ + '¥' + .richText + .withTextSpanChildren([ + '${model.discount.toStringAsFixed(0)}.' + .textSpan + .size(36.sp) + .color(Color(0xFFC92219)) + .bold + .make(), + ((model.discount.toDouble() - + model.commission.toInt()) * + 100) + .toStringAsFixed(0) + .textSpan + .color(Color(0xFFC92219)) + .size(24.sp) + .bold + .make() + ]) + .color(Color(0xFFC92219)) + .size(24.sp) + .bold + .make(), + 8.w.widthBox, + '赚:${model.commission.toStringAsFixed(2)}'.text.color(Color(0xFFC92219)).size(24.sp).make() + // Spacer(), + // PlusMinusView( + // onValueChanged: (value) { + // _goodsCount = value; + // setState(() {}); + // }, + // initialValue: 1, + // onInputComplete: (text) { + // _goodsCount = int.parse(text); + // }, + // ) + ], + ) + ], + ), + ], + ) + ], + ) + .box + .padding(EdgeInsets.symmetric(horizontal: 20.w, vertical: 26.w)) + .withRounded(value: 10.w) + .width(double.infinity) + .color(Colors.white) + .make(); + } + + Widget emptyWidget() { + return Container(); + } + + Future _getScanModel() async { + ResultData resultData = + await HttpManager.post(APIV2.userAPI.getScanResult, { + "skuCode": widget.code, + }); + if (resultData.data == null) { + ReToast.err(text: resultData.msg); + return; + } else { + return ScanResultModel.fromMap(resultData.data['data']); + } + } + Widget _buyButton() { return CustomImageButton( title: "立即购买", diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index f6f1c9f..11d9b66 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -639,7 +639,7 @@ class _HomePageState extends BaseStoreState arguments: BrandGoodsListPage.setArguments( model.brandId, model.brandName)); }, - model: model + model: model, buyClick: () { AppRouter.push(context, RouteName.COMMODITY_PAGE, arguments: diff --git a/lib/widgets/barcodeScan.dart b/lib/widgets/barcodeScan.dart index ca5502f..a884dfe 100644 --- a/lib/widgets/barcodeScan.dart +++ b/lib/widgets/barcodeScan.dart @@ -112,14 +112,17 @@ class _BarcodeScanPageState extends BaseStoreState { if (!TextUtils.isEmpty(data)) { _playSound(); _key.currentState.stopScan(); - Future.delayed(Duration(milliseconds: 500), () { - _getGoodsWithCode(data, (goodsId) { - Get.to(() => QRScarerResultPage()); - // AppRouter.pushAndReplaced(globalContext, RouteName.COMMODITY_PAGE, - // arguments: CommodityDetailPage.setArguments(int.parse(goodsId))); - return; - }, image: image); - }); + + Get.off(() => QRScarerResultPage( + code: data, + )); + // Future.delayed(Duration(milliseconds: 500), () { + // _getGoodsWithCode(data, (goodsId) { + // // AppRouter.pushAndReplaced(globalContext, RouteName.COMMODITY_PAGE, + // // arguments: CommodityDetailPage.setArguments(int.parse(goodsId))); + // return; + // }, image: image); + // }); } else { _key.currentState.startScan(); }