对接:扫描二维码接口 完成扫码界面

master
zhangmeng 4 years ago
parent 1a694b791a
commit 3677f8b064

@ -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 {

@ -181,7 +181,7 @@ class HttpManager {
response =
await dio.request<String>(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;

@ -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<String, dynamic> toMap() {
return {
'skuID': skuID,
'skuCode': skuCode,
'skuName': skuName,
'brandName': brandName,
'brandImg': brandImg,
'goodsName': goodsName,
'discount': discount,
'commission': commission,
'goodsImg': goodsImg,
};
}
factory ScanResultModel.fromMap(Map<String, dynamic> 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;
}
}

@ -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<QRScarerResultPage> {
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<QRScarerResultPage> {
);
}
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: "立即购买",

@ -639,7 +639,7 @@ class _HomePageState extends BaseStoreState<HomePage>
arguments: BrandGoodsListPage.setArguments(
model.brandId, model.brandName));
},
model: model
model: model,
buyClick: () {
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments:

@ -112,14 +112,17 @@ class _BarcodeScanPageState extends BaseStoreState<BarcodeScanPage> {
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();
}

Loading…
Cancel
Save