You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
app/lib/pages/home/barcode/qr_scaner_result_page.dart

295 lines
9.4 KiB

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/manager/user_manager.dart';
import 'package:recook/models/base_model.dart';
import 'package:recook/models/order_preview_model.dart';
import 'package:recook/models/scan_result_model.dart';
import 'package:recook/pages/home/classify/commodity_detail_page.dart';
import 'package:recook/pages/home/classify/mvp/goods_detail_model_impl.dart';
import 'package:recook/pages/home/classify/order_preview_page.dart';
import 'package:recook/pages/home/widget/plus_minus_view.dart';
import 'package:recook/pages/shopping_cart/mvp/shopping_cart_model_impl.dart';
import 'package:recook/utils/app_router.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/toast.dart';
import 'package:velocity_x/velocity_x.dart';
import 'package:recook/const/resource.dart';
class QRScarerResultPage extends StatefulWidget {
final ScanResultModel model;
QRScarerResultPage({Key key, this.model}) : super(key: key);
@override
_QRScarerResultPageState createState() => _QRScarerResultPageState();
}
class _QRScarerResultPageState extends State<QRScarerResultPage> {
int _goodsCount = 1;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return RecookScaffold(
title: '扫码购物',
body: ListView(
padding: EdgeInsets.symmetric(vertical: 22.w, horizontal: 20.w),
children: [_goodsCard(widget.model)],
),
bottomNavi: Row(
children: [
_addShopButton().expand(),
2.widthBox,
_buyButton().expand()
],
)
.pSymmetric(h: 32.w)
.box
.color(Colors.white)
.padding(EdgeInsets.only(bottom: ScreenUtil().bottomBarHeight))
.width(double.infinity)
.height(128.w)
.make(),
);
}
Widget _goodsCard(ScanResultModel model) {
return Column(
children: [
Row(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(4.w),
child: FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(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: [
ClipRRect(
borderRadius: BorderRadius.circular(10.w),
child: FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(model.goodsImg),
width: 200.w,
height: 200.w,
fit: BoxFit.contain,
),
),
20.w.widthBox,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
model.goodsName.text
.size(28.sp)
.bold
.lineHeight(1)
.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
.toStringAsFixed(2)
.split('.')[1]
.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))
.bold
.size(24.sp)
.make(),
PlusMinusView(
onValueChanged: (value) {
_goodsCount = value;
},
initialValue: 1,
maxValue: getMaxGoodsCount,
onInputComplete: (text) {
_goodsCount = int.parse(text);
},
).expand()
],
)
],
).expand(),
],
)
],
)
.box
.padding(EdgeInsets.symmetric(horizontal: 20.w, vertical: 26.w))
.withRounded(value: 10.w)
.width(double.infinity)
.color(Colors.white)
.make()
.onInkTap(() {
Get.to(() => CommodityDetailPage(arguments: {"goodsID": widget.model.goodsID},));
// AppRouter.push(context, RouteName.COMMODITY_PAGE,
// arguments: CommodityDetailPage.setArguments(widget.model.goodsId));
});
}
Widget emptyWidget() {
return Container();
}
int get getMaxGoodsCount {
if (widget.model?.inventory == null) {
ReToast.warning(text: '库存数量错误');
return 0;
}
if (widget.model.inventory == 0) {
ReToast.warning(text: '库存数量为0');
return 0;
}
return widget.model.inventory < 50 ? widget.model.inventory : 50;
}
Widget _buyButton() {
return CustomImageButton(
title: "立即购买",
color: Colors.white,
height: 80.w,
boxDecoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xffc81a3e), Color(0xfffa4968)]),
borderRadius: BorderRadius.only(
topRight: Radius.circular(30), bottomRight: Radius.circular(30))),
fontSize: 32.sp,
onPressed: getMaxGoodsCount == 0
? null
: () {
_createOrder(widget.model.skuID, widget.model.skuName,
_goodsCount, context);
},
);
}
Widget _addShopButton() {
return CustomImageButton(
title: "加入购物车",
color: Colors.white,
height: 80.w,
boxDecoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xff979797), Color(0xff5d5e5d)]),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30), bottomLeft: Radius.circular(30))),
fontSize: 32.sp,
onPressed: getMaxGoodsCount == 0
? null
: () {
_addToShoppingCart(widget.model.skuID, widget.model.skuName,
_goodsCount, context);
},
);
}
Future<dynamic> _createOrder(
int skuId, String skuName, int quantity, BuildContext context,
{bool isLive = false, int liveId = 0}) async {
OrderPreviewModel order = await GoodsDetailModelImpl.createOrderPreview(
UserManager.instance.user.info.id,
skuId,
skuName,
quantity,
liveId: isLive ? liveId : null,
);
if (order.code != HttpStatus.SUCCESS) {
ReToast.err(text: order.msg);
Get.back();
return;
}
AppRouter.push(context, RouteName.GOODS_ORDER_PAGE,
arguments: GoodsOrderPage.setArguments(order));
}
Future<dynamic> _addToShoppingCart(
int skuId,
String skuName,
int quantity,
BuildContext context,
) async {
ResultData resultData = await ShoppingCartModelImpl().addToShoppingCart(
UserManager.instance.user.info.id,
skuId,
skuName,
quantity,
);
if (!resultData.result) {
ReToast.err(text: resultData.msg);
Get.back();
return;
}
BaseModel model = BaseModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
Toast.showError(model.msg);
Get.back();
return;
}
UserManager.instance.refreshShoppingCart.value = true;
UserManager.instance.refreshShoppingCartNumber.value = true;
UserManager.instance.refreshShoppingCartNumberWithPage.value = true;
ReToast.success(text: '加入成功');
}
}