parent
4cc56b0622
commit
596ed6d4bb
@ -1,110 +0,0 @@
|
||||
class CategoryModel {
|
||||
int? id;
|
||||
String? name;
|
||||
List<String>? imgUrls;
|
||||
List<CategoryList>? categoryList;
|
||||
|
||||
CategoryModel({this.id, this.name, this.categoryList, this.imgUrls});
|
||||
|
||||
CategoryModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
if (json['imgUrls'] != null) {
|
||||
imgUrls = [];
|
||||
json['imgUrls'].forEach((v) {
|
||||
imgUrls!.add(v.toString());
|
||||
});
|
||||
}
|
||||
if (json['categoryList'] != null) {
|
||||
categoryList = [];
|
||||
json['categoryList'].forEach((v) {
|
||||
categoryList!.add(new CategoryList.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['name'] = this.name;
|
||||
if (this.categoryList != null) {
|
||||
data['categoryList'] = this.categoryList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (this.imgUrls != null) {
|
||||
data['imgUrls'] = this.imgUrls!.map((v) => v).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class CategoryList {
|
||||
int? id;
|
||||
List<String>? imgUrls;
|
||||
String? name;
|
||||
List<CategoryListSecond>? categoryListSecond;
|
||||
|
||||
CategoryList({this.id, this.name, this.categoryListSecond});
|
||||
|
||||
CategoryList.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
if (json['categoryList'] != null) {
|
||||
categoryListSecond = [];
|
||||
json['categoryList'].forEach((v) {
|
||||
categoryListSecond!.add(new CategoryListSecond.fromJson(v));
|
||||
});
|
||||
}
|
||||
if (json['imgUrls'] != null) {
|
||||
imgUrls = [];
|
||||
json['imgUrls'].forEach((v) {
|
||||
imgUrls!.add(v.toString());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['name'] = this.name;
|
||||
if (this.categoryListSecond != null) {
|
||||
data['categoryList'] =
|
||||
this.categoryListSecond!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (this.imgUrls != null) {
|
||||
data['imgUrls'] = this.imgUrls!.map((v) => v).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class CategoryListSecond {
|
||||
int? id;
|
||||
String? name;
|
||||
List<String>? imgUrls;
|
||||
|
||||
CategoryListSecond({
|
||||
this.id,
|
||||
this.name,
|
||||
});
|
||||
|
||||
CategoryListSecond.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
if (json['imgUrls'] != null) {
|
||||
imgUrls = [];
|
||||
json['imgUrls'].forEach((v) {
|
||||
imgUrls!.add(v.toString());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['name'] = this.name;
|
||||
if (this.imgUrls != null) {
|
||||
data['imgUrls'] = this.imgUrls!.map((v) => v).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
@ -1,187 +0,0 @@
|
||||
import 'package:aku_new_community/ui/market/shop_car/shop_car_func.dart';
|
||||
|
||||
class GoodDetailModel {
|
||||
int? id;
|
||||
List<GoodsDetailImageVos>? goodsDetailImageVos;
|
||||
double? sellPrice;
|
||||
double? discountPrice;
|
||||
String? skuName;
|
||||
int? status;
|
||||
int? shopStatus;
|
||||
int? sellNum;
|
||||
int? kind;
|
||||
String? defaultLocation;
|
||||
String? defaultAddressDetail;
|
||||
int? stockStatus;
|
||||
List<GoodsDetailSpecificationVoList>? goodsDetailSpecificationVoList;
|
||||
int? isCollection;
|
||||
String? unit;
|
||||
double? weight;
|
||||
|
||||
factory GoodDetailModel.fail() => GoodDetailModel(
|
||||
goodsDetailImageVos: [],
|
||||
sellPrice: 0,
|
||||
discountPrice: 0,
|
||||
skuName: '',
|
||||
sellNum: 0,
|
||||
kind: 0,
|
||||
defaultLocation: '',
|
||||
defaultAddressDetail: '',
|
||||
stockStatus: 0,
|
||||
goodsDetailSpecificationVoList: [],
|
||||
isCollection: 0,
|
||||
unit: '',
|
||||
weight: 0);
|
||||
|
||||
GoodStatus get goodStatus =>
|
||||
ShopCarFunc.getGoodsStatus(status ?? 1, shopStatus ?? 1);
|
||||
|
||||
GoodDetailModel(
|
||||
{this.id,
|
||||
this.goodsDetailImageVos,
|
||||
this.sellPrice,
|
||||
this.discountPrice,
|
||||
this.skuName,
|
||||
this.status,
|
||||
this.shopStatus,
|
||||
this.sellNum,
|
||||
this.kind,
|
||||
this.defaultLocation,
|
||||
this.defaultAddressDetail,
|
||||
this.stockStatus,
|
||||
this.goodsDetailSpecificationVoList,
|
||||
this.isCollection,
|
||||
this.unit,
|
||||
this.weight});
|
||||
|
||||
GoodDetailModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
if (json['goodsDetailImageVos'] != null) {
|
||||
goodsDetailImageVos = [];
|
||||
json['goodsDetailImageVos'].forEach((v) {
|
||||
goodsDetailImageVos!.add(new GoodsDetailImageVos.fromJson(v));
|
||||
});
|
||||
}
|
||||
sellPrice = json['sellPrice'];
|
||||
discountPrice = json['discountPrice'];
|
||||
skuName = json['skuName'];
|
||||
status = json['status'];
|
||||
shopStatus = json['shopStatus'];
|
||||
sellNum = json['sellNum'];
|
||||
kind = json['kind'];
|
||||
defaultLocation = json['defaultLocation'];
|
||||
defaultAddressDetail = json['defaultAddressDetail'];
|
||||
stockStatus = json['stockStatus'];
|
||||
if (json['goodsDetailSpecificationVoList'] != null) {
|
||||
goodsDetailSpecificationVoList = [];
|
||||
json['goodsDetailSpecificationVoList'].forEach((v) {
|
||||
goodsDetailSpecificationVoList!
|
||||
.add(new GoodsDetailSpecificationVoList.fromJson(v));
|
||||
});
|
||||
}
|
||||
isCollection = json['isCollection'];
|
||||
unit = json['unit'];
|
||||
weight = json['weight'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
if (this.goodsDetailImageVos != null) {
|
||||
data['goodsDetailImageVos'] =
|
||||
this.goodsDetailImageVos!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
data['sellPrice'] = this.sellPrice;
|
||||
data['discountPrice'] = this.discountPrice;
|
||||
data['skuName'] = this.skuName;
|
||||
data['status'] = this.status;
|
||||
data['shopStatus'] = this.shopStatus;
|
||||
data['sellNum'] = this.sellNum;
|
||||
data['kind'] = this.kind;
|
||||
data['defaultLocation'] = this.defaultLocation;
|
||||
data['defaultAddressDetail'] = this.defaultAddressDetail;
|
||||
data['stockStatus'] = this.stockStatus;
|
||||
if (this.goodsDetailSpecificationVoList != null) {
|
||||
data['goodsDetailSpecificationVoList'] =
|
||||
this.goodsDetailSpecificationVoList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
data['isCollection'] = this.isCollection;
|
||||
data['unit'] = this.unit;
|
||||
data['weight'] = this.weight;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class GoodsDetailImageVos {
|
||||
int? id;
|
||||
int? jcookGoodsId;
|
||||
String? url;
|
||||
int? isPrimer;
|
||||
int? orderSort;
|
||||
|
||||
GoodsDetailImageVos(
|
||||
{this.id, this.jcookGoodsId, this.url, this.isPrimer, this.orderSort});
|
||||
|
||||
GoodsDetailImageVos.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
jcookGoodsId = json['jcookGoodsId'];
|
||||
url = json['url'];
|
||||
isPrimer = json['isPrimer'];
|
||||
orderSort = json['orderSort'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['jcookGoodsId'] = this.jcookGoodsId;
|
||||
data['url'] = this.url;
|
||||
data['isPrimer'] = this.isPrimer;
|
||||
data['orderSort'] = this.orderSort;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class GoodsDetailSpecificationVoList {
|
||||
String? groupName;
|
||||
List<Attribute>? attribute;
|
||||
|
||||
GoodsDetailSpecificationVoList({this.groupName, this.attribute});
|
||||
|
||||
GoodsDetailSpecificationVoList.fromJson(Map<String, dynamic> json) {
|
||||
groupName = json['groupName'];
|
||||
if (json['attribute'] != null) {
|
||||
attribute = [];
|
||||
json['attribute'].forEach((v) {
|
||||
attribute!.add(new Attribute.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['groupName'] = this.groupName;
|
||||
if (this.attribute != null) {
|
||||
data['attribute'] = this.attribute!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class Attribute {
|
||||
String? name;
|
||||
String? value;
|
||||
|
||||
Attribute({this.name, this.value});
|
||||
|
||||
Attribute.fromJson(Map<String, dynamic> json) {
|
||||
name = json['name'];
|
||||
value = json['value'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['name'] = this.name;
|
||||
data['value'] = this.value;
|
||||
return data;
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/utils/network/base_model.dart';
|
||||
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||
|
||||
class DisplayCategoryModel {
|
||||
final MarketCategoryModel model;
|
||||
final List<MarketCategoryModel> children;
|
||||
|
||||
DisplayCategoryModel({
|
||||
required this.model,
|
||||
required this.children,
|
||||
});
|
||||
|
||||
static Future<List<MarketCategoryModel>> get top8 async {
|
||||
List<MarketCategoryModel> models = await fetchCategory(0);
|
||||
if (models.length >= 8)
|
||||
return models.getRange(0, 8).toList();
|
||||
else
|
||||
return models;
|
||||
}
|
||||
|
||||
///获取分类列表
|
||||
static Future<List<MarketCategoryModel>> fetchCategory(int parentId) async {
|
||||
BaseModel model = await NetUtil().get(
|
||||
API.market.category,
|
||||
params: {'parentId': parentId},
|
||||
);
|
||||
if (model.data == null) return [];
|
||||
return (model.data as List)
|
||||
.map((e) => MarketCategoryModel.fromJson(e))
|
||||
.toList();
|
||||
}
|
||||
}
|
@ -0,0 +1,115 @@
|
||||
import 'package:aku_new_community/ui/market/shop_car/shop_car_func.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'good_detail_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class GoodDetailModel {
|
||||
final int id;
|
||||
final List<JcookImageVoList> jcookImageVoList;
|
||||
final num sellPrice;
|
||||
final num discountPrice;
|
||||
final String skuName;
|
||||
final int status;
|
||||
final int shopStatus;
|
||||
final int sellNum;
|
||||
final int kind;
|
||||
final String defaultLocation;
|
||||
final String defaultAddressDetail;
|
||||
final int stockStatus;
|
||||
final List<JcookSpecificationVoList> jcookSpecificationVoList;
|
||||
final int isCollection;
|
||||
final String unit;
|
||||
final num weight;
|
||||
|
||||
factory GoodDetailModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$GoodDetailModelFromJson(json);
|
||||
|
||||
GoodStatus get goodStatus =>
|
||||
ShopCarFunc.getGoodsStatus(status ?? 1, shopStatus ?? 1);
|
||||
|
||||
static GoodDetailModel fail() => GoodDetailModel(
|
||||
id: 0,
|
||||
jcookImageVoList: [],
|
||||
sellPrice: 0,
|
||||
discountPrice: 0,
|
||||
skuName: '',
|
||||
status: 0,
|
||||
shopStatus: 0,
|
||||
sellNum: 0,
|
||||
kind: 0,
|
||||
defaultLocation: '',
|
||||
defaultAddressDetail: '',
|
||||
stockStatus: 0,
|
||||
jcookSpecificationVoList: [],
|
||||
isCollection: 0,
|
||||
unit: '',
|
||||
weight: 0);
|
||||
|
||||
const GoodDetailModel({
|
||||
required this.id,
|
||||
required this.jcookImageVoList,
|
||||
required this.sellPrice,
|
||||
required this.discountPrice,
|
||||
required this.skuName,
|
||||
required this.status,
|
||||
required this.shopStatus,
|
||||
required this.sellNum,
|
||||
required this.kind,
|
||||
required this.defaultLocation,
|
||||
required this.defaultAddressDetail,
|
||||
required this.stockStatus,
|
||||
required this.jcookSpecificationVoList,
|
||||
required this.isCollection,
|
||||
required this.unit,
|
||||
required this.weight,
|
||||
});
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class JcookImageVoList {
|
||||
final int id;
|
||||
final int jcookGoodsId;
|
||||
final String url;
|
||||
final int isPrimer;
|
||||
final int orderSort;
|
||||
|
||||
factory JcookImageVoList.fromJson(Map<String, dynamic> json) =>
|
||||
_$JcookImageVoListFromJson(json);
|
||||
|
||||
const JcookImageVoList({
|
||||
required this.id,
|
||||
required this.jcookGoodsId,
|
||||
required this.url,
|
||||
required this.isPrimer,
|
||||
required this.orderSort,
|
||||
});
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class JcookSpecificationVoList {
|
||||
final String groupName;
|
||||
final List<Attribute> attribute;
|
||||
|
||||
factory JcookSpecificationVoList.fromJson(Map<String, dynamic> json) =>
|
||||
_$JcookSpecificationVoListFromJson(json);
|
||||
|
||||
const JcookSpecificationVoList({
|
||||
required this.groupName,
|
||||
required this.attribute,
|
||||
});
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class Attribute {
|
||||
final String name;
|
||||
final String value;
|
||||
|
||||
factory Attribute.fromJson(Map<String, dynamic> json) =>
|
||||
_$AttributeFromJson(json);
|
||||
|
||||
const Attribute({
|
||||
required this.name,
|
||||
required this.value,
|
||||
});
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'good_detail_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
GoodDetailModel _$GoodDetailModelFromJson(Map<String, dynamic> json) =>
|
||||
GoodDetailModel(
|
||||
id: json['id'] as int,
|
||||
jcookImageVoList: (json['jcookImageVoList'] as List<dynamic>)
|
||||
.map((e) => JcookImageVoList.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
sellPrice: json['sellPrice'] as num,
|
||||
discountPrice: json['discountPrice'] as num,
|
||||
skuName: json['skuName'] as String,
|
||||
status: json['status'] as int,
|
||||
shopStatus: json['shopStatus'] as int,
|
||||
sellNum: json['sellNum'] as int,
|
||||
kind: json['kind'] as int,
|
||||
defaultLocation: json['defaultLocation'] as String,
|
||||
defaultAddressDetail: json['defaultAddressDetail'] as String,
|
||||
stockStatus: json['stockStatus'] as int,
|
||||
jcookSpecificationVoList:
|
||||
(json['jcookSpecificationVoList'] as List<dynamic>)
|
||||
.map((e) =>
|
||||
JcookSpecificationVoList.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
isCollection: json['isCollection'] as int,
|
||||
unit: json['unit'] as String,
|
||||
weight: json['weight'] as num,
|
||||
);
|
||||
|
||||
JcookImageVoList _$JcookImageVoListFromJson(Map<String, dynamic> json) =>
|
||||
JcookImageVoList(
|
||||
id: json['id'] as int,
|
||||
jcookGoodsId: json['jcookGoodsId'] as int,
|
||||
url: json['url'] as String,
|
||||
isPrimer: json['isPrimer'] as int,
|
||||
orderSort: json['orderSort'] as int,
|
||||
);
|
||||
|
||||
JcookSpecificationVoList _$JcookSpecificationVoListFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
JcookSpecificationVoList(
|
||||
groupName: json['groupName'] as String,
|
||||
attribute: (json['attribute'] as List<dynamic>)
|
||||
.map((e) => Attribute.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
);
|
||||
|
||||
Attribute _$AttributeFromJson(Map<String, dynamic> json) => Attribute(
|
||||
name: json['name'] as String,
|
||||
value: json['value'] as String,
|
||||
);
|
@ -1,33 +0,0 @@
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
|
||||
class GoodsClassification {
|
||||
int? id;
|
||||
String? name;
|
||||
List<ImgModel>? imgUrls;
|
||||
|
||||
GoodsClassification({this.id, this.name, this.imgUrls});
|
||||
|
||||
GoodsClassification.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
if (json['imgUrls'] != null) {
|
||||
imgUrls = [];
|
||||
json['imgUrls'].forEach((v) {
|
||||
imgUrls!.add(new ImgModel.fromJson(v));
|
||||
});
|
||||
} else {
|
||||
imgUrls = [];
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['name'] = this.name;
|
||||
data['imgUrls'] = this.imgUrls;
|
||||
if (this.imgUrls != null) {
|
||||
data['imgUrls'] = this.imgUrls!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'goods_detail_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class GoodsDetailModel extends Equatable {
|
||||
final int id;
|
||||
final String recommend;
|
||||
final String title;
|
||||
final double sellingPrice;
|
||||
final double markingPrice;
|
||||
final String categoryName;
|
||||
final int subscribeNum;
|
||||
final String detail;
|
||||
final String? arrivalTime;
|
||||
final List<ImgModel> goodsImgList;
|
||||
final int supplierId;
|
||||
final String supplierName;
|
||||
final String supplierTel;
|
||||
final String? supplierAddress;
|
||||
final List<ImgModel> supplierImgList;
|
||||
final int isSubscribe;
|
||||
|
||||
GoodsDetailModel(
|
||||
this.id,
|
||||
this.recommend,
|
||||
this.title,
|
||||
this.sellingPrice,
|
||||
this.markingPrice,
|
||||
this.categoryName,
|
||||
this.subscribeNum,
|
||||
this.detail,
|
||||
this.arrivalTime,
|
||||
this.goodsImgList,
|
||||
this.supplierId,
|
||||
this.supplierName,
|
||||
this.supplierTel,
|
||||
this.supplierAddress,
|
||||
this.supplierImgList,
|
||||
this.isSubscribe);
|
||||
|
||||
@override
|
||||
List<Object?> get props => throw UnimplementedError();
|
||||
|
||||
factory GoodsDetailModel.fail() => GoodsDetailModel(
|
||||
0,
|
||||
'',
|
||||
'',
|
||||
0.0,
|
||||
0.0,
|
||||
'',
|
||||
0,
|
||||
'',
|
||||
'',
|
||||
[],
|
||||
0,
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
[],
|
||||
0,
|
||||
);
|
||||
|
||||
factory GoodsDetailModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$GoodsDetailModelFromJson(json);
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'goods_detail_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
GoodsDetailModel _$GoodsDetailModelFromJson(Map<String, dynamic> json) =>
|
||||
GoodsDetailModel(
|
||||
json['id'] as int,
|
||||
json['recommend'] as String,
|
||||
json['title'] as String,
|
||||
(json['sellingPrice'] as num).toDouble(),
|
||||
(json['markingPrice'] as num).toDouble(),
|
||||
json['categoryName'] as String,
|
||||
json['subscribeNum'] as int,
|
||||
json['detail'] as String,
|
||||
json['arrivalTime'] as String?,
|
||||
(json['goodsImgList'] as List<dynamic>)
|
||||
.map((e) => ImgModel.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
json['supplierId'] as int,
|
||||
json['supplierName'] as String,
|
||||
json['supplierTel'] as String,
|
||||
json['supplierAddress'] as String?,
|
||||
(json['supplierImgList'] as List<dynamic>)
|
||||
.map((e) => ImgModel.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
json['isSubscribe'] as int,
|
||||
);
|
@ -1,41 +0,0 @@
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'goods_item.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class GoodsItem extends Equatable {
|
||||
final int id;
|
||||
final String title;
|
||||
final String recommend;
|
||||
final num sellingPrice;
|
||||
final num markingPrice;
|
||||
final int subscribeNum;
|
||||
final List<ImgModel> imgList;
|
||||
|
||||
GoodsItem({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.recommend,
|
||||
required this.sellingPrice,
|
||||
required this.markingPrice,
|
||||
required this.subscribeNum,
|
||||
required this.imgList,
|
||||
});
|
||||
|
||||
factory GoodsItem.example() => GoodsItem(
|
||||
id: 0,
|
||||
title: '华为mate30',
|
||||
recommend: '九成新,无磨损',
|
||||
sellingPrice: 1000,
|
||||
markingPrice: 2000,
|
||||
subscribeNum: 0,
|
||||
imgList: []);
|
||||
|
||||
@override
|
||||
List<Object?> get props => throw UnimplementedError();
|
||||
|
||||
factory GoodsItem.fromJson(Map<String, dynamic> json) =>
|
||||
_$GoodsItemFromJson(json);
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'goods_item.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
GoodsItem _$GoodsItemFromJson(Map<String, dynamic> json) => GoodsItem(
|
||||
id: json['id'] as int,
|
||||
title: json['title'] as String,
|
||||
recommend: json['recommend'] as String,
|
||||
sellingPrice: json['sellingPrice'] as num,
|
||||
markingPrice: json['markingPrice'] as num,
|
||||
subscribeNum: json['subscribeNum'] as int,
|
||||
imgList: (json['imgList'] as List<dynamic>)
|
||||
.map((e) => ImgModel.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
);
|
@ -1,24 +1,20 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'goods_popular_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class GoodsPopularModel {
|
||||
int? id;
|
||||
String? skuName;
|
||||
String? mainPhoto;
|
||||
int? viewsNum;
|
||||
factory GoodsPopularModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$GoodsPopularModelFromJson(json);
|
||||
|
||||
GoodsPopularModel({this.id, this.skuName, this.mainPhoto, this.viewsNum});
|
||||
|
||||
GoodsPopularModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
skuName = json['skuName'];
|
||||
mainPhoto = json['mainPhoto'];
|
||||
viewsNum = json['viewsNum'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['skuName'] = this.skuName;
|
||||
data['mainPhoto'] = this.mainPhoto;
|
||||
data['viewsNum'] = this.viewsNum;
|
||||
return data;
|
||||
}
|
||||
GoodsPopularModel({
|
||||
this.id,
|
||||
this.skuName,
|
||||
this.mainPhoto,
|
||||
this.viewsNum,
|
||||
});
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'goods_popular_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
GoodsPopularModel _$GoodsPopularModelFromJson(Map<String, dynamic> json) =>
|
||||
GoodsPopularModel(
|
||||
id: json['id'] as int?,
|
||||
skuName: json['skuName'] as String?,
|
||||
mainPhoto: json['mainPhoto'] as String?,
|
||||
viewsNum: json['viewsNum'] as int?,
|
||||
);
|
@ -0,0 +1,20 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'market_all_category_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class MarketAllCategoryModel {
|
||||
final int id;
|
||||
final String name;
|
||||
final List<String> imgUrls;
|
||||
final List<MarketAllCategoryModel> categoryList;
|
||||
factory MarketAllCategoryModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$MarketAllCategoryModelFromJson(json);
|
||||
|
||||
const MarketAllCategoryModel({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.imgUrls,
|
||||
required this.categoryList,
|
||||
});
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'market_all_category_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
MarketAllCategoryModel _$MarketAllCategoryModelFromJson(
|
||||
Map<String, dynamic> json) =>
|
||||
MarketAllCategoryModel(
|
||||
id: json['id'] as int,
|
||||
name: json['name'] as String,
|
||||
imgUrls:
|
||||
(json['imgUrls'] as List<dynamic>).map((e) => e as String).toList(),
|
||||
categoryList: (json['categoryList'] as List<dynamic>)
|
||||
.map(
|
||||
(e) => MarketAllCategoryModel.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
);
|
@ -1,51 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/display_category_model.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_list_view.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class CategoryCard extends StatelessWidget {
|
||||
final MarketCategoryModel model;
|
||||
|
||||
const CategoryCard({Key? key, required this.model}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
child: Column(
|
||||
children: [
|
||||
Spacer(),
|
||||
FadeInImage.assetNetwork(
|
||||
image: API.image(ImgModel.first(model.imgList)),
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
height: 75.w,
|
||||
width: 75.w,
|
||||
),
|
||||
12.hb,
|
||||
Text(
|
||||
model.name,
|
||||
style: TextStyle(
|
||||
fontSize: 24.sp,
|
||||
color: Color(0xFF4A4B51),
|
||||
),
|
||||
),
|
||||
Spacer(),
|
||||
],
|
||||
),
|
||||
onPressed: () async {
|
||||
final cancel = BotToast.showLoading();
|
||||
List<MarketCategoryModel> models =
|
||||
await DisplayCategoryModel.fetchCategory(model.id);
|
||||
cancel();
|
||||
Get.to(() => GoodsListView(
|
||||
model: model,
|
||||
subModels: models,
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/ui/market/category/category_sub_view.dart';
|
||||
import 'package:aku_new_community/ui/market/search/search_goods_page.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class CategoryPage extends StatefulWidget {
|
||||
final List<MarketCategoryModel> models;
|
||||
|
||||
CategoryPage({Key? key, required this.models}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CategoryPageState createState() => _CategoryPageState();
|
||||
}
|
||||
|
||||
class _CategoryPageState extends State<CategoryPage>
|
||||
with TickerProviderStateMixin {
|
||||
int _index = 0;
|
||||
late TabController _tabController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tabController = TabController(length: widget.models.length, vsync: this);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '分类',
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: Icon(CupertinoIcons.search),
|
||||
onPressed: () {
|
||||
Get.to(() => SearchGoodsPage());
|
||||
},
|
||||
),
|
||||
],
|
||||
bgColor: Colors.white,
|
||||
appBarBottom: PreferredSize(
|
||||
child: Divider(height: 1),
|
||||
preferredSize: Size.fromHeight(1),
|
||||
),
|
||||
body: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 203.w,
|
||||
child: ListView.builder(
|
||||
physics: ClampingScrollPhysics(),
|
||||
itemBuilder: (context, index) {
|
||||
bool sameIndex = index == _index;
|
||||
final item = widget.models[index];
|
||||
return Stack(
|
||||
children: [
|
||||
MaterialButton(
|
||||
height: 100.w,
|
||||
minWidth: double.infinity,
|
||||
onPressed: () {
|
||||
_index = index;
|
||||
_tabController.animateTo(index);
|
||||
setState(() {});
|
||||
},
|
||||
child: Text(
|
||||
item.name,
|
||||
style: TextStyle(
|
||||
color: sameIndex ? kPrimaryColor : ktextPrimary,
|
||||
),
|
||||
),
|
||||
),
|
||||
AnimatedPositioned(
|
||||
left: sameIndex ? 0 : -8.w,
|
||||
top: sameIndex ? 20.w : 30.w,
|
||||
bottom: sameIndex ? 20.w : 30.w,
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOutCubic,
|
||||
child: Container(
|
||||
color: kPrimaryColor,
|
||||
width: 8.w,
|
||||
height: 40.w,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
itemCount: widget.models.length,
|
||||
),
|
||||
),
|
||||
VerticalDivider(
|
||||
color: Color(0xFFE8E8E8),
|
||||
width: 1,
|
||||
thickness: 1,
|
||||
),
|
||||
TabBarView(
|
||||
controller: _tabController,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
children:
|
||||
widget.models.map((e) => CategorySubView(model: e)).toList(),
|
||||
).expand(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_list_view.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class CategorySubCard extends StatelessWidget {
|
||||
final List<MarketCategoryModel> subModels;
|
||||
final MarketCategoryModel selectModel;
|
||||
final MarketCategoryModel model;
|
||||
|
||||
const CategorySubCard({
|
||||
Key? key,
|
||||
required this.model,
|
||||
required this.subModels,
|
||||
required this.selectModel,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
child: Column(
|
||||
children: [
|
||||
Spacer(),
|
||||
FadeInImage.assetNetwork(
|
||||
image: API.image(ImgModel.first(selectModel.imgList)),
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
height: 75.w,
|
||||
width: 75.w,
|
||||
),
|
||||
12.hb,
|
||||
Text(
|
||||
selectModel.name,
|
||||
style: TextStyle(
|
||||
fontSize: 24.sp,
|
||||
color: Color(0xFF4A4B51),
|
||||
),
|
||||
),
|
||||
Spacer(),
|
||||
],
|
||||
),
|
||||
onPressed: () async {
|
||||
await Get.to(
|
||||
() => GoodsListView(
|
||||
model: model,
|
||||
subModels: subModels,
|
||||
selectSubModel: selectModel,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
import 'package:aku_new_community/models/market/display_category_model.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/ui/market/category/category_sub_card.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||
|
||||
class CategorySubView extends StatefulWidget {
|
||||
final MarketCategoryModel model;
|
||||
|
||||
CategorySubView({Key? key, required this.model}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CategorySubViewState createState() => _CategorySubViewState();
|
||||
}
|
||||
|
||||
class _CategorySubViewState extends State<CategorySubView>
|
||||
with AutomaticKeepAliveClientMixin {
|
||||
List<MarketCategoryModel> _models = [];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
super.build(context);
|
||||
return EasyRefresh(
|
||||
header: MaterialHeader(),
|
||||
firstRefresh: true,
|
||||
onRefresh: () async {
|
||||
_models = await DisplayCategoryModel.fetchCategory(widget.model.id);
|
||||
setState(() {});
|
||||
},
|
||||
child: GridView.builder(
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 3,
|
||||
),
|
||||
itemBuilder: (context, index) {
|
||||
final model = _models[index];
|
||||
return CategorySubCard(
|
||||
model: widget.model,
|
||||
selectModel: model,
|
||||
subModels: _models,
|
||||
);
|
||||
},
|
||||
itemCount: _models.length,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
}
|
@ -1,220 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_detail_page.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class GoodsCard extends StatelessWidget {
|
||||
final GoodsItem item;
|
||||
final bool? border;
|
||||
|
||||
const GoodsCard({Key? key, required this.item, this.border})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
color: Colors.white,
|
||||
elevation: 0,
|
||||
shape: !(border ?? false)
|
||||
? null
|
||||
: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
side: BorderSide(color: Color(0xFFC4C4C4))),
|
||||
padding: EdgeInsets.zero,
|
||||
onPressed: () => Get.to(
|
||||
() => GoodsDetailPage(id: item.id),
|
||||
preventDuplicates: false,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12.w)),
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
FadeInImage.assetNetwork(
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
image: ImgModel.first(item.imgList),
|
||||
fit: BoxFit.fill,
|
||||
imageErrorBuilder: (context, error, stackTrace) {
|
||||
return Image.asset(R.ASSETS_IMAGES_PLACEHOLDER_WEBP);
|
||||
},
|
||||
),
|
||||
Positioned(
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
child: Container(
|
||||
height: 38.w,
|
||||
color: Colors.black54,
|
||||
alignment: Alignment.centerLeft,
|
||||
padding: EdgeInsets.symmetric(horizontal: 12.w),
|
||||
child: Text(
|
||||
item.recommend,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: 16.w,
|
||||
right: 16.w,
|
||||
top: 10.w,
|
||||
),
|
||||
child: Text(
|
||||
item.title,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(fontSize: 28.sp, color: ktextPrimary),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: 16.w,
|
||||
right: 16.w,
|
||||
top: 10.w,
|
||||
),
|
||||
child: Container(
|
||||
child: _getIcon(1),
|
||||
)),
|
||||
10.hb,
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '¥',
|
||||
style: TextStyle(
|
||||
color: Colors.red,
|
||||
fontSize: 28.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '${item.sellingPrice} ',
|
||||
style: TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 40.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '原价:¥',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '${item.markingPrice}',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
decoration: TextDecoration.lineThrough,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '折扣:',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '9折',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getIcon(int type) {
|
||||
if (type == 1) {
|
||||
return Container(
|
||||
width: 86.w,
|
||||
height: 26.w,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(4.w),
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
begin: FractionalOffset.centerLeft,
|
||||
end: FractionalOffset.centerRight,
|
||||
colors: <Color>[Color(0xFFEC5329), Color(0xFFF58123)],
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'京东自营',
|
||||
style: TextStyle(fontSize: 18.sp, color: kForeGroundColor),
|
||||
),
|
||||
);
|
||||
} else if (type == 2) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
width: 86.w,
|
||||
height: 30.w,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(4.w),
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
begin: FractionalOffset.centerLeft,
|
||||
end: FractionalOffset.centerRight,
|
||||
colors: <Color>[Color(0xFFF59B1C), Color(0xFFF5AF16)],
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'京东POP',
|
||||
style: TextStyle(fontSize: 18.sp, color: kForeGroundColor),
|
||||
),
|
||||
);
|
||||
} else
|
||||
return SizedBox();
|
||||
}
|
||||
}
|
@ -1,145 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_tab_list_view.dart';
|
||||
import 'package:aku_new_community/ui/market/search/search_goods_page.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class GoodsListView extends StatefulWidget {
|
||||
final MarketCategoryModel model;
|
||||
final MarketCategoryModel? selectSubModel;
|
||||
final List<MarketCategoryModel> subModels;
|
||||
|
||||
GoodsListView({
|
||||
Key? key,
|
||||
required this.model,
|
||||
required this.subModels,
|
||||
this.selectSubModel,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_GoodsListViewState createState() => _GoodsListViewState();
|
||||
}
|
||||
|
||||
class _GoodsListViewState extends State<GoodsListView>
|
||||
with TickerProviderStateMixin {
|
||||
late MarketCategoryModel? _selectModel;
|
||||
late TabController _tabController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
int initIndex = 0;
|
||||
//初始化已选项目
|
||||
if (widget.subModels.isNotEmpty) {
|
||||
_selectModel = widget.subModels.first;
|
||||
if (widget.selectSubModel != null) {
|
||||
_selectModel = widget.selectSubModel;
|
||||
initIndex = widget.subModels.indexOf(widget.selectSubModel!);
|
||||
}
|
||||
}
|
||||
|
||||
_tabController = TabController(
|
||||
length: widget.subModels.length,
|
||||
vsync: this,
|
||||
initialIndex: initIndex,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: widget.model.name,
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: Icon(CupertinoIcons.search),
|
||||
onPressed: () {
|
||||
Get.to(() => SearchGoodsPage());
|
||||
},
|
||||
)
|
||||
],
|
||||
appBarBottom: PreferredSize(
|
||||
child: SizedBox(
|
||||
height: 220.w,
|
||||
child: ListView.builder(
|
||||
padding: EdgeInsets.symmetric(horizontal: 18.w),
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemBuilder: (context, index) {
|
||||
return GoodsSubTypeButton(
|
||||
model: widget.subModels[index],
|
||||
groupValue: _selectModel,
|
||||
onTap: () {
|
||||
_selectModel = widget.subModels[index];
|
||||
_tabController.animateTo(index);
|
||||
setState(() {});
|
||||
},
|
||||
);
|
||||
},
|
||||
itemCount: widget.subModels.length,
|
||||
),
|
||||
),
|
||||
preferredSize: Size.fromHeight(220.w),
|
||||
),
|
||||
body: TabBarView(
|
||||
children:
|
||||
widget.subModels.map((e) => GoodsTabListView(model: e)).toList(),
|
||||
controller: _tabController,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class GoodsSubTypeButton extends StatelessWidget {
|
||||
final MarketCategoryModel model;
|
||||
final MarketCategoryModel? groupValue;
|
||||
final VoidCallback onTap;
|
||||
|
||||
const GoodsSubTypeButton({
|
||||
Key? key,
|
||||
required this.model,
|
||||
required this.groupValue,
|
||||
required this.onTap,
|
||||
}) : super(key: key);
|
||||
|
||||
bool get same => model == groupValue;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
minWidth: 136.w,
|
||||
padding: EdgeInsets.zero,
|
||||
onPressed: onTap,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
FadeInImage.assetNetwork(
|
||||
image: API.image(ImgModel.first(model.imgList)),
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
width: 100.w,
|
||||
height: 100.w,
|
||||
),
|
||||
20.hb,
|
||||
Text(
|
||||
model.name,
|
||||
style: TextStyle(
|
||||
fontSize: 24.sp,
|
||||
color: same ? kPrimaryColor : ktextPrimary,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,304 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/const/resource.dart';
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/extensions/widget_list_ext.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/goods_detail_model.dart';
|
||||
import 'package:aku_new_community/pages/life_pay/pay_finish_page.dart';
|
||||
import 'package:aku_new_community/pages/life_pay/pay_util.dart';
|
||||
import 'package:aku_new_community/ui/profile/house/house_owners_page.dart';
|
||||
import 'package:aku_new_community/utils/network/base_model.dart';
|
||||
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||
import 'package:aku_new_community/widget/bee_divider.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/buttons/bee_numberic_button.dart';
|
||||
import 'package:aku_new_community/widget/buttons/bottom_button.dart';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class GoodsOrderDetailPage extends StatefulWidget {
|
||||
final GoodsDetailModel model;
|
||||
final String name;
|
||||
final String phone;
|
||||
|
||||
GoodsOrderDetailPage(
|
||||
{Key? key, required this.model, required this.name, required this.phone})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_GoodsOrderDetailPageState createState() => _GoodsOrderDetailPageState();
|
||||
}
|
||||
|
||||
class _GoodsOrderDetailPageState extends State<GoodsOrderDetailPage> {
|
||||
late EasyRefreshController _refreshController;
|
||||
bool _onload = true;
|
||||
|
||||
///商品数量
|
||||
int _num = 1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_refreshController = EasyRefreshController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_refreshController.dispose();
|
||||
BotToast.closeAllLoading();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '确认订单',
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Get.to(() => HouseOwnersPage(
|
||||
identify: 4,
|
||||
));
|
||||
},
|
||||
child: '切换房屋'.text.size(28.sp).color(ktextPrimary).make())
|
||||
],
|
||||
body: EasyRefresh(
|
||||
header: MaterialHeader(),
|
||||
firstRefresh: true,
|
||||
onRefresh: () async {
|
||||
_onload = false;
|
||||
setState(() {});
|
||||
},
|
||||
child: _onload
|
||||
? Container()
|
||||
: ListView(
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w),
|
||||
children: <Widget>[
|
||||
_addressInfo(),
|
||||
_goodsInfoWidget(),
|
||||
].sepWidget(
|
||||
separate: 24.w.heightBox,
|
||||
),
|
||||
),
|
||||
),
|
||||
bottomNavi: BottomButton(
|
||||
onPressed: () async {
|
||||
final cancel = BotToast.showLoading();
|
||||
BaseModel baseModel = await NetUtil().post(
|
||||
API.pay.shoppingAlipay,
|
||||
params: {
|
||||
'goodsId': widget.model.id,
|
||||
'userName': widget.name,
|
||||
'userTel': widget.phone,
|
||||
'num': _num,
|
||||
'payType': 1,
|
||||
'payPrice': widget.model.sellingPrice,
|
||||
},
|
||||
showMessage: false,
|
||||
);
|
||||
if ((baseModel.success) && !baseModel.msg.isEmptyOrNull) {
|
||||
bool result = await PayUtil()
|
||||
.callAliPay(baseModel.msg, API.pay.shoppingCheck);
|
||||
if (result) {
|
||||
Get.off(() => PayFinishPage());
|
||||
}
|
||||
} else {
|
||||
BotToast.showText(text: baseModel.msg);
|
||||
}
|
||||
cancel();
|
||||
},
|
||||
child: '立即支付'.text.size(32.sp).color(ktextPrimary).bold.make()),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _addressInfo() {
|
||||
return Container(
|
||||
padding: EdgeInsets.all(24.w),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
widget.model.title.text
|
||||
.size(32.sp)
|
||||
.color(ktextPrimary)
|
||||
.bold
|
||||
.maxLines(2)
|
||||
.ellipsis
|
||||
.make(),
|
||||
20.w.heightBox,
|
||||
Row(
|
||||
children: [
|
||||
widget.name.text.size(24.sp).color(ktextSubColor).make(),
|
||||
24.w.widthBox,
|
||||
widget.phone.text.size(24.sp).color(ktextSubColor).make(),
|
||||
Spacer(),
|
||||
'送出时间等待电话联系'.text.size(24.sp).color(ktextPrimary).bold.make(),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _goodsInfoWidget() {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
),
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
'商品信息'.text.size(32.sp).bold.color(ktextPrimary).make(),
|
||||
Spacer(),
|
||||
// widget.model.statusString.text
|
||||
// .size(30.sp)
|
||||
// .bold
|
||||
// .color(widget.model.statusColor)
|
||||
// .make(),
|
||||
],
|
||||
),
|
||||
16.w.heightBox,
|
||||
BeeDivider.horizontal(),
|
||||
24.w.heightBox,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: FadeInImage.assetNetwork(
|
||||
width: 160.w,
|
||||
height: 160.w,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
image:
|
||||
API.image(ImgModel.first(widget.model.goodsImgList))),
|
||||
),
|
||||
24.w.widthBox,
|
||||
SizedBox(
|
||||
height: 160.w,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
widget.model.title.text
|
||||
.size(28.sp)
|
||||
.color(ktextPrimary)
|
||||
.maxLines(2)
|
||||
.overflow(TextOverflow.ellipsis)
|
||||
.bold
|
||||
.maxLines(2)
|
||||
.ellipsis
|
||||
.make()
|
||||
.expand(),
|
||||
'¥${widget.model.sellingPrice}'
|
||||
.text
|
||||
.size(28.sp)
|
||||
.bold
|
||||
.color(Color(0xFFE60E0E))
|
||||
.make(),
|
||||
],
|
||||
),
|
||||
Spacer(),
|
||||
Row(
|
||||
children: [
|
||||
//|${widget.model.levelTwoCategory}
|
||||
('${widget.model.categoryName}')
|
||||
.text
|
||||
.size(24.sp)
|
||||
.color(ktextSubColor)
|
||||
.make()
|
||||
],
|
||||
),
|
||||
12.w.heightBox,
|
||||
Row(
|
||||
children: [
|
||||
('${widget.model.recommend}')
|
||||
.text
|
||||
.size(24.sp)
|
||||
.color(ktextSubColor)
|
||||
.make()
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
).expand()
|
||||
],
|
||||
),
|
||||
40.w.heightBox,
|
||||
...<Widget>[
|
||||
Row(
|
||||
children: [
|
||||
// (160 + 24).w.widthBox,
|
||||
'数量'.text.size(24.sp).color(ktextSubColor).make(),
|
||||
Spacer(),
|
||||
BeeNumberPickerButton(
|
||||
initValue: 1,
|
||||
minValue: 1,
|
||||
maxValue: 99,
|
||||
onChange: (value) {
|
||||
_num = value;
|
||||
})
|
||||
],
|
||||
),
|
||||
_rowTile('配送方式', '商家配送'),
|
||||
_rowTile('订单备注', widget.model.arrivalTime ?? ''),
|
||||
].sepWidget(
|
||||
separate: 20.w.heightBox,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Widget _orderInfo() {
|
||||
// return Container(
|
||||
// width: double.infinity,
|
||||
// padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.white, borderRadius: BorderRadius.circular(8.w)),
|
||||
// child: Column(
|
||||
// children: [
|
||||
// Row(
|
||||
// children: [
|
||||
// '订单信息'.text.size(32.sp).bold.color(ktextPrimary).make(),
|
||||
// ],
|
||||
// ),
|
||||
// 24.w.heightBox,
|
||||
// ...<Widget>[
|
||||
// _rowTile('配送方式', '商家配送'),
|
||||
// ].sepWidget(
|
||||
// separate: 20.w.heightBox,
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget _rowTile(
|
||||
String title,
|
||||
String content,
|
||||
) {
|
||||
return Row(
|
||||
children: [
|
||||
// (160 + 24).w.widthBox,
|
||||
title.text.size(24.sp).color(ktextSubColor).make(),
|
||||
Spacer(),
|
||||
content.text.size(24.sp).color(ktextPrimary).make(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
import 'package:aku_new_community/pages/things_page/widget/bee_list_view.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_card.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||
import 'package:waterfall_flow/waterfall_flow.dart';
|
||||
|
||||
class GoodsTabListView extends StatefulWidget {
|
||||
final MarketCategoryModel model;
|
||||
|
||||
GoodsTabListView({Key? key, required this.model}) : super(key: key);
|
||||
|
||||
@override
|
||||
_GoodsTabListViewState createState() => _GoodsTabListViewState();
|
||||
}
|
||||
|
||||
class _GoodsTabListViewState extends State<GoodsTabListView>
|
||||
with AutomaticKeepAliveClientMixin {
|
||||
EasyRefreshController _refreshController = EasyRefreshController();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
super.build(context);
|
||||
return BeeListView<GoodsItem>(
|
||||
path: API.market.list,
|
||||
controller: _refreshController,
|
||||
extraParams: {'categoryId': widget.model.id},
|
||||
convert: (model) =>
|
||||
model.tableList?.map((e) => GoodsItem.fromJson(e)).toList() ?? [],
|
||||
builder: (items) {
|
||||
return WaterfallFlow.builder(
|
||||
padding: EdgeInsets.all(32.w),
|
||||
gridDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2, crossAxisSpacing: 24.w, mainAxisSpacing: 24.w),
|
||||
itemBuilder: (context, index) {
|
||||
final GoodsItem item = items[index];
|
||||
return GoodsCard(item: item);
|
||||
},
|
||||
itemCount: items.length,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
}
|
@ -1,301 +0,0 @@
|
||||
// // import 'package:aku_new_community/base/base_style.dart';
|
||||
//
|
||||
// import 'package:flutter/cupertino.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
//
|
||||
// import 'package:bot_toast/bot_toast.dart';
|
||||
// import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||
// import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
// import 'package:get/get.dart';
|
||||
// import 'package:waterfall_flow/waterfall_flow.dart';
|
||||
//
|
||||
// import 'package:aku_new_community/constants/api.dart';
|
||||
// import 'package:aku_new_community/models/market/display_category_model.dart';
|
||||
// import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
// import 'package:aku_new_community/models/market/market_category_model.dart';
|
||||
// import 'package:aku_new_community/ui/market/category/category_card.dart';
|
||||
// import 'package:aku_new_community/ui/market/category/category_page.dart';
|
||||
// import 'package:aku_new_community/ui/market/goods/goods_card.dart';
|
||||
// import 'package:aku_new_community/ui/market/order/my_order_page.dart';
|
||||
// import 'package:aku_new_community/ui/market/search/search_goods_page.dart';
|
||||
// import 'package:aku_new_community/utils/headers.dart';
|
||||
// import 'package:aku_new_community/utils/network/base_list_model.dart';
|
||||
// import 'package:aku_new_community/utils/network/net_util.dart';
|
||||
// import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
//
|
||||
// // import 'package:aku_new_community/ui/market/goods/goods_detail_page.dart';
|
||||
//
|
||||
// // import 'package:aku_new_community/widget/tab_bar/bee_tab_bar.dart';
|
||||
//
|
||||
// class MarketPage111 extends StatefulWidget {
|
||||
// MarketPage111({Key? key}) : super(key: key);
|
||||
//
|
||||
// @override
|
||||
// _MarketPageState createState() => _MarketPageState();
|
||||
// }
|
||||
//
|
||||
// class _MarketPageState extends State<MarketPage111>
|
||||
// with AutomaticKeepAliveClientMixin {
|
||||
// List<MarketCategoryModel> _marketModels = [];
|
||||
// List<GoodsItem> _hotItems = [];
|
||||
// late EasyRefreshController _refreshController;
|
||||
// int _pageNum = 1;
|
||||
// int _size = 4;
|
||||
// int _pageCount = 0;
|
||||
//
|
||||
// Future updateMarketInfo() async {
|
||||
// BaseListModel baseListModel =
|
||||
// await NetUtil().getList(API.market.hotTop, params: {
|
||||
// "pageNum": _pageNum,
|
||||
// "size": _size,
|
||||
// });
|
||||
// if (baseListModel.tableList!.isNotEmpty) {
|
||||
// _hotItems = (baseListModel.tableList as List)
|
||||
// .map((e) => GoodsItem.fromJson(e))
|
||||
// .toList();
|
||||
// }
|
||||
// _pageCount = baseListModel.pageCount!;
|
||||
// }
|
||||
//
|
||||
// Future loadMarketInfo() async {
|
||||
// BaseListModel baseListModel =
|
||||
// await NetUtil().getList(API.market.hotTop, params: {
|
||||
// "pageNum": _pageNum,
|
||||
// "size": _size,
|
||||
// });
|
||||
// if (baseListModel.tableList!.isNotEmpty) {
|
||||
// _hotItems.addAll((baseListModel.tableList as List)
|
||||
// .map((e) => GoodsItem.fromJson(e))
|
||||
// .toList());
|
||||
// }
|
||||
// _pageCount = baseListModel.pageCount!;
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// void initState() {
|
||||
// super.initState();
|
||||
// _refreshController = EasyRefreshController();
|
||||
// Future.delayed(Duration(milliseconds: 0), () async {
|
||||
// _marketModels = await DisplayCategoryModel.top8;
|
||||
// await updateMarketInfo();
|
||||
// setState(() {});
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// void dispose() {
|
||||
// _refreshController.dispose();
|
||||
// super.dispose();
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// super.build(context);
|
||||
// final mediaWidth = MediaQuery.of(context).size.width;
|
||||
// return BeeScaffold(
|
||||
// leading: IconButton(
|
||||
// icon: Icon(CupertinoIcons.search),
|
||||
// onPressed: () {
|
||||
// Get.to(() => SearchGoodsPage());
|
||||
// },
|
||||
// ),
|
||||
// title: '商城',
|
||||
// actions: [
|
||||
// MaterialButton(
|
||||
// minWidth: 108.w,
|
||||
// padding: EdgeInsets.zero,
|
||||
// onPressed: () async {
|
||||
// // Get.to(() => SecondHandPage());
|
||||
// Get.to(() => MyOrderPage());
|
||||
// },
|
||||
// child: Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// mainAxisSize: MainAxisSize.max,
|
||||
// children: [
|
||||
// Image.asset(
|
||||
// R.ASSETS_ICONS_SECOND_HAND_PNG,
|
||||
// width: 48.w,
|
||||
// height: 48.w,
|
||||
// ),
|
||||
// 4.hb,
|
||||
// // '二手'.text.size(20.sp).black.make(),
|
||||
// '订单'.text.size(20.sp).black.make(),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// MaterialButton(
|
||||
// minWidth: 108.w,
|
||||
// padding: EdgeInsets.zero,
|
||||
// onPressed: () async {
|
||||
// final cancel = BotToast.showLoading();
|
||||
// List<MarketCategoryModel> models =
|
||||
// await DisplayCategoryModel.fetchCategory(0);
|
||||
// cancel();
|
||||
// Get.to(() => CategoryPage(models: models));
|
||||
// },
|
||||
// child: Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// mainAxisSize: MainAxisSize.max,
|
||||
// children: [
|
||||
// Image.asset(
|
||||
// R.ASSETS_ICONS_CATEGORY_PNG,
|
||||
// width: 48.w,
|
||||
// height: 48.w,
|
||||
// ),
|
||||
// 4.hb,
|
||||
// '分类'.text.size(20.sp).black.make(),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// body:
|
||||
// NestedScrollView(
|
||||
// headerSliverBuilder: (context, value) {
|
||||
// var gridItems = Material(
|
||||
// color: Colors.white,
|
||||
// clipBehavior: Clip.antiAlias,
|
||||
// borderRadius: BorderRadius.circular(8.w),
|
||||
// child: GridView(
|
||||
// physics: NeverScrollableScrollPhysics(),
|
||||
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
// crossAxisCount: 4,
|
||||
// childAspectRatio: 1,
|
||||
// ),
|
||||
// shrinkWrap: true,
|
||||
// children:
|
||||
// _marketModels.map((e) => CategoryCard(model: e)).toList(),
|
||||
// ),
|
||||
// );
|
||||
// return [
|
||||
// SliverAppBar(
|
||||
// //AppBar top Widget height
|
||||
// //bottom height: 48
|
||||
// // flexibleSpace的高为 (设备宽 - 边距)/4*2 + 外边距 + bottom高 + top热搜栏
|
||||
// // * 热搜栏
|
||||
// //expandedHeight:
|
||||
// //(mediaWidth - 32.w * 2) / 4 * 2 + 16.w * 2 + 48 + 68.w,
|
||||
// //
|
||||
// expandedHeight: (mediaWidth - 32.w * 2) / 4 * 2 + 16.w * 2,
|
||||
// backgroundColor: Colors.transparent,
|
||||
// elevation: 0,
|
||||
// flexibleSpace: FlexibleSpaceBar(
|
||||
// background: Container(
|
||||
// color: Color(0xFFF9F9F9),
|
||||
// padding: EdgeInsets.only(
|
||||
// top: 16.w,
|
||||
// left: 32.w,
|
||||
// right: 32.w,
|
||||
// bottom: 16.w, //底部边距需要加上bottom高
|
||||
// ),
|
||||
// child: Column(
|
||||
// children: [
|
||||
// // SizedBox(
|
||||
// // height: 58.w,
|
||||
// // child: Row(
|
||||
// // children: [
|
||||
// // Text(
|
||||
// // '热搜:',
|
||||
// // style: TextStyle(
|
||||
// // fontSize: 20.sp,
|
||||
// // ),
|
||||
// // ),
|
||||
// // 20.wb,
|
||||
// // ListView.separated(
|
||||
// // scrollDirection: Axis.horizontal,
|
||||
// // separatorBuilder: (_, __) => 20.wb,
|
||||
// // itemBuilder: (context, index) {
|
||||
// // final item = _hotItems[index];
|
||||
// // return MaterialButton(
|
||||
// // padding:
|
||||
// // EdgeInsets.symmetric(horizontal: 40.w),
|
||||
// // minWidth: 0,
|
||||
// // shape: StadiumBorder(
|
||||
// // side: BorderSide(
|
||||
// // color: ktextSubColor,
|
||||
// // width: 1,
|
||||
// // ),
|
||||
// // ),
|
||||
// // materialTapTargetSize:
|
||||
// // MaterialTapTargetSize.shrinkWrap,
|
||||
// // onPressed: () {
|
||||
// // Get.to(() => GoodsDetailPage(id: item.id));
|
||||
// // },
|
||||
// // child: Text(
|
||||
// // item.title,
|
||||
// // style: TextStyle(
|
||||
// // color: ktextSubColor,
|
||||
// // ),
|
||||
// // ),
|
||||
// // );
|
||||
// // },
|
||||
// // itemCount: _hotItems.length,
|
||||
// // ).expand(),
|
||||
// // ],
|
||||
// // ),
|
||||
// // ),
|
||||
// // 10.hb,
|
||||
// gridItems.expand(),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// pinned: true,
|
||||
// toolbarHeight: 0,
|
||||
// // bottom: PreferredSize(
|
||||
// // child: Material(
|
||||
// // color: Color(0xFFF9F9F9),
|
||||
// // child: Align(
|
||||
// // alignment: Alignment.centerLeft,
|
||||
// // child: BeeTabBar(
|
||||
// // scrollable: true,
|
||||
// // controller: _tabController,
|
||||
// // tabs: ['社区商城', '二手市场'],
|
||||
// // ),
|
||||
// // ),
|
||||
// // ),
|
||||
// // preferredSize: Size.fromHeight(48),
|
||||
// // ),
|
||||
// ),
|
||||
// ];
|
||||
// },
|
||||
// body: EasyRefresh(
|
||||
// firstRefresh: false,
|
||||
// enableControlFinishLoad: false,
|
||||
// header: MaterialHeader(),
|
||||
// footer: MaterialFooter(),
|
||||
// controller: _refreshController,
|
||||
// onRefresh: () async {
|
||||
// _pageNum = 1;
|
||||
// await updateMarketInfo();
|
||||
// setState(() {});
|
||||
// },
|
||||
// onLoad: () async {
|
||||
// _pageNum++;
|
||||
// await loadMarketInfo();
|
||||
// if (_pageCount <= _pageNum) {
|
||||
// _refreshController.finishLoad(noMore: false);
|
||||
// }
|
||||
// setState(() {});
|
||||
// },
|
||||
// child: WaterfallFlow.builder(
|
||||
// gridDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
|
||||
// crossAxisCount: 2,
|
||||
// mainAxisSpacing: 20.w,
|
||||
// crossAxisSpacing: 20.w,
|
||||
// ),
|
||||
// padding: EdgeInsets.all(32.w),
|
||||
// itemBuilder: (context, index) {
|
||||
// return SizedBox();
|
||||
// //final item = _hotItems[index];
|
||||
// // return GoodsCard(item: item);
|
||||
// },
|
||||
// itemCount: _hotItems.length,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// bool get wantKeepAlive => true;
|
||||
// }
|
@ -1,219 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/const/resource.dart';
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/extensions/widget_list_ext.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/order/my_order_list_model.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_detail_page.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_evaluation_page.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_func.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_refund_page.dart';
|
||||
import 'package:aku_new_community/ui/market/order/receive_success.dart';
|
||||
import 'package:aku_new_community/widget/bee_divider.dart';
|
||||
import 'package:aku_new_community/widget/buttons/card_bottom_button.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class MyOrderCard extends StatefulWidget {
|
||||
final MyOrderListModel model;
|
||||
final VoidCallback callRefresh;
|
||||
|
||||
MyOrderCard({Key? key, required this.model, required this.callRefresh})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_MyOrderCardState createState() => _MyOrderCardState();
|
||||
}
|
||||
|
||||
class _MyOrderCardState extends State<MyOrderCard> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
Get.to(() => MyOrderDetailPage(
|
||||
model: widget.model,
|
||||
));
|
||||
},
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
),
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
widget.model.goodsName.text
|
||||
.size(32.sp)
|
||||
.bold
|
||||
.color(ktextPrimary)
|
||||
.make(),
|
||||
Spacer(),
|
||||
widget.model.statusString.text
|
||||
.size(30.sp)
|
||||
.bold
|
||||
.color(widget.model.statusColor)
|
||||
.make(),
|
||||
],
|
||||
),
|
||||
16.w.heightBox,
|
||||
BeeDivider.horizontal(),
|
||||
24.w.heightBox,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: FadeInImage.assetNetwork(
|
||||
width: 160.w,
|
||||
height: 160.w,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
image:
|
||||
API.image(ImgModel.first(widget.model.goodsImgList))),
|
||||
),
|
||||
24.w.widthBox,
|
||||
SizedBox(
|
||||
height: 160.w,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
widget.model.goodsName.text
|
||||
.size(28.sp)
|
||||
.color(ktextPrimary)
|
||||
.maxLines(2)
|
||||
.overflow(TextOverflow.ellipsis)
|
||||
.bold
|
||||
.make(),
|
||||
Spacer(),
|
||||
'¥${widget.model.sellingPrice}'
|
||||
.text
|
||||
.size(28.sp)
|
||||
.bold
|
||||
.color(Color(0xFFE60E0E))
|
||||
.make(),
|
||||
],
|
||||
),
|
||||
Spacer(),
|
||||
Row(
|
||||
children: [
|
||||
('${widget.model.levelOneCategory}|${widget.model.levelTwoCategory}')
|
||||
.text
|
||||
.size(24.sp)
|
||||
.color(ktextSubColor)
|
||||
.make()
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
).expand()
|
||||
],
|
||||
),
|
||||
40.w.heightBox,
|
||||
...[
|
||||
_rowTile('下单时间', widget.model.arrivalDateString),
|
||||
_rowTile('到达地点', '人才公寓小区北侧门口'),
|
||||
_rowTile('发货时间', widget.model.sendDateString),
|
||||
].sepWidget(separate: 16.w.heightBox),
|
||||
..._bottomWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> _bottomWidget() {
|
||||
List<Widget> _buttons = _getBottomButton(widget.model.status);
|
||||
|
||||
return _buttons.isEmpty
|
||||
? []
|
||||
: [
|
||||
40.w.heightBox,
|
||||
Row(
|
||||
children: [Spacer(), ..._buttons],
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<Widget> _getBottomButton(int status) {
|
||||
switch (status) {
|
||||
case 1:
|
||||
return [
|
||||
CardBottomButton.white(
|
||||
text: '取消预约',
|
||||
onPressed: () async {
|
||||
await MyOrderFunc.cancelOrder(widget.model.id);
|
||||
widget.callRefresh();
|
||||
}),
|
||||
].sepWidget(separate: 24.w.widthBox);
|
||||
case 2:
|
||||
return <Widget>[
|
||||
CardBottomButton.yellow(
|
||||
text: '查看详情',
|
||||
onPressed: () {
|
||||
Get.to(MyOrderDetailPage(model: widget.model));
|
||||
}),
|
||||
].sepWidget(separate: 24.w.widthBox);
|
||||
case 3:
|
||||
return [
|
||||
CardBottomButton.yellow(
|
||||
text: '确认收货',
|
||||
onPressed: () async {
|
||||
var re = await MyOrderFunc.confirmReceive(widget.model.id);
|
||||
widget.callRefresh();
|
||||
if (re) {
|
||||
Get.to(() => ReceiveSuccess());
|
||||
}
|
||||
}),
|
||||
].sepWidget(separate: 24.w.widthBox);
|
||||
case 4:
|
||||
return <Widget>[
|
||||
CardBottomButton.white(
|
||||
text: '评价商品',
|
||||
onPressed: () async {
|
||||
await Get.to(() => MyOrderEvaluationPage(model: widget.model));
|
||||
widget.callRefresh();
|
||||
}),
|
||||
CardBottomButton.white(
|
||||
text: '申请退换',
|
||||
onPressed: () async {
|
||||
await Get.to(() => MyOrderRefundPage(
|
||||
model: widget.model,
|
||||
));
|
||||
widget.callRefresh();
|
||||
}),
|
||||
].sepWidget(separate: 24.w.widthBox);
|
||||
case 6:
|
||||
return <Widget>[
|
||||
CardBottomButton.yellow(text: '查看详情', onPressed: () {}),
|
||||
];
|
||||
case 8:
|
||||
return <Widget>[
|
||||
CardBottomButton.yellow(text: '查看详情', onPressed: () {}),
|
||||
];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
Widget _rowTile(
|
||||
String title,
|
||||
String content,
|
||||
) {
|
||||
return Row(
|
||||
children: [
|
||||
// (160 + 24).w.widthBox,
|
||||
title.text.size(24.sp).color(ktextSubColor).make(),
|
||||
Spacer(),
|
||||
content.text.size(24.sp).color(ktextPrimary).make(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
@ -1,190 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/const/resource.dart';
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/order/my_order_list_model.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_func.dart';
|
||||
import 'package:aku_new_community/widget/bee_divider.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/buttons/bottom_button.dart';
|
||||
import 'package:aku_new_community/widget/others/bee_text_field.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class MyOrderEvaluationPage extends StatefulWidget {
|
||||
final MyOrderListModel model;
|
||||
|
||||
MyOrderEvaluationPage({Key? key, required this.model}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MyOrderEvaluationPageState createState() => _MyOrderEvaluationPageState();
|
||||
}
|
||||
|
||||
class _MyOrderEvaluationPageState extends State<MyOrderEvaluationPage> {
|
||||
late TextEditingController _editingController;
|
||||
int _rating = 10;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_editingController = TextEditingController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_editingController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '商品评价',
|
||||
body: ListView(
|
||||
padding: EdgeInsets.all(32.w),
|
||||
children: [
|
||||
_goodsInfoWidget(),
|
||||
24.w.heightBox,
|
||||
_resonWidget(),
|
||||
],
|
||||
),
|
||||
bottomNavi: BottomButton(
|
||||
onPressed: () async {
|
||||
await MyOrderFunc.goodsEvalution(
|
||||
widget.model.id, _rating, _editingController.text);
|
||||
},
|
||||
child: '确认提交'.text.size(32.sp).color(ktextPrimary).bold.make()),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _goodsInfoWidget() {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
),
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
'商品信息'.text.size(32.sp).bold.color(ktextPrimary).make(),
|
||||
Spacer(),
|
||||
// widget.model.statusString.text
|
||||
// .size(30.sp)
|
||||
// .bold
|
||||
// .color(widget.model.statusColor)
|
||||
// .make(),
|
||||
],
|
||||
),
|
||||
16.w.heightBox,
|
||||
BeeDivider.horizontal(),
|
||||
24.w.heightBox,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: FadeInImage.assetNetwork(
|
||||
width: 160.w,
|
||||
height: 160.w,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
image:
|
||||
API.image(ImgModel.first(widget.model.goodsImgList))),
|
||||
),
|
||||
24.w.widthBox,
|
||||
SizedBox(
|
||||
height: 160.w,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
widget.model.goodsName.text
|
||||
.size(28.sp)
|
||||
.color(ktextPrimary)
|
||||
.maxLines(2)
|
||||
.overflow(TextOverflow.ellipsis)
|
||||
.bold
|
||||
.make(),
|
||||
Spacer(),
|
||||
'¥${widget.model.sellingPrice}'
|
||||
.text
|
||||
.size(28.sp)
|
||||
.bold
|
||||
.color(Color(0xFFE60E0E))
|
||||
.make(),
|
||||
],
|
||||
),
|
||||
Spacer(),
|
||||
Row(
|
||||
children: [
|
||||
('${widget.model.levelOneCategory}|${widget.model.levelTwoCategory}')
|
||||
.text
|
||||
.size(24.sp)
|
||||
.color(ktextSubColor)
|
||||
.make()
|
||||
],
|
||||
),
|
||||
// 12.w.heightBox,
|
||||
// Row(
|
||||
// children: [
|
||||
// ('${widget.model.levelTwoCategory}')
|
||||
// .text
|
||||
// .size(24.sp)
|
||||
// .color(ktextSubColor)
|
||||
// .make()
|
||||
// ],
|
||||
// ),
|
||||
],
|
||||
),
|
||||
).expand()
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _resonWidget() {
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 24.w),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
'商品评价'.text.size(32.sp).bold.color(ktextPrimary).make(),
|
||||
32.w.heightBox,
|
||||
RatingBar.builder(
|
||||
initialRating: _rating / 2,
|
||||
minRating: 0,
|
||||
direction: Axis.horizontal,
|
||||
allowHalfRating: true,
|
||||
itemCount: 5,
|
||||
// itemPadding: EdgeInsets.symmetric(horizontal: 16.w),
|
||||
itemBuilder: (context, _) => Icon(
|
||||
Icons.star_border_rounded,
|
||||
color: kPrimaryColor,
|
||||
),
|
||||
itemSize: 64.w,
|
||||
onRatingUpdate: (rating) {
|
||||
_rating = rating.floor();
|
||||
},
|
||||
glow: false,
|
||||
),
|
||||
32.w.heightBox,
|
||||
BeeTextField(controller: _editingController, hintText: '请输入评价内容')
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
import 'package:aku_new_community/models/market/order/order_detail_model.dart';
|
||||
import 'package:aku_new_community/utils/network/base_model.dart';
|
||||
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||
|
||||
class MyOrderFunc {
|
||||
///确认收货
|
||||
static Future<bool> confirmReceive(int goodsAppointmentId) async {
|
||||
var result = await NetUtil().get(API.market.confirmReceive,
|
||||
params: {"goodsAppointmentId": goodsAppointmentId}, showMessage: true);
|
||||
return result.success;
|
||||
}
|
||||
|
||||
///申请退换
|
||||
static Future refundOrder(
|
||||
int goodsAppointmentId, String reson, int type) async {
|
||||
BaseModel baseModel = await NetUtil().get(API.market.refundOrder,
|
||||
params: {
|
||||
"goodsAppointmentId": goodsAppointmentId,
|
||||
"backReason": reson,
|
||||
"backType": type
|
||||
},
|
||||
showMessage: true);
|
||||
return baseModel;
|
||||
}
|
||||
|
||||
///取消预约
|
||||
static Future cancelOrder(int goodsAppointmentId) async {
|
||||
BaseModel baseModel = await NetUtil().get(API.market.cancleOrder,
|
||||
params: {"goodsAppointmentId": goodsAppointmentId}, showMessage: true);
|
||||
return baseModel;
|
||||
}
|
||||
|
||||
///商品评价
|
||||
static Future goodsEvalution(
|
||||
int goodsAppointmentId, int rating, String evaluationReason) async {
|
||||
BaseModel baseModel = await NetUtil().get(API.market.goodsEvaluation,
|
||||
params: {
|
||||
"goodsAppointmentId": goodsAppointmentId,
|
||||
"score": rating,
|
||||
"evaluationReason": evaluationReason
|
||||
},
|
||||
showMessage: true);
|
||||
return baseModel;
|
||||
}
|
||||
|
||||
/// 获取此供应商热度最高的商品
|
||||
static Future<List<GoodsItem>> getHotTops(int supplierId) async {
|
||||
BaseModel baseModel =
|
||||
await NetUtil().get(API.market.suppliyerHotTop, params: {
|
||||
"supplierId": supplierId,
|
||||
});
|
||||
if (baseModel.success == true && baseModel.data != null) {
|
||||
return (baseModel.data as List)
|
||||
.map((e) => GoodsItem.fromJson(e))
|
||||
.toList();
|
||||
} else
|
||||
return [];
|
||||
}
|
||||
|
||||
///获取商品详情
|
||||
static Future getOrderDetail(int goodsAppointmentId) async {
|
||||
BaseModel baseModel = await NetUtil().get(API.market.orderDetail,
|
||||
params: {"goodsAppointmentId": goodsAppointmentId});
|
||||
if (baseModel.success && baseModel.data != null) {
|
||||
return OrderDetailModel.fromJson(baseModel.data);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
import 'package:aku_new_community/ui/market/order/my_order_view.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/tab_bar/bee_tab_bar.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class MyOrderPage extends StatefulWidget {
|
||||
MyOrderPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MyOrderPageState createState() => _MyOrderPageState();
|
||||
}
|
||||
|
||||
class _MyOrderPageState extends State<MyOrderPage>
|
||||
with TickerProviderStateMixin {
|
||||
late TabController _tabController;
|
||||
List<String> _tabs = [
|
||||
'待发货',
|
||||
'已发货',
|
||||
'已到货',
|
||||
'已收货',
|
||||
'已评价',
|
||||
'退换货申请',
|
||||
];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_tabController = TabController(length: _tabs.length, vsync: this);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
int _transIndes(int index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
return 1;
|
||||
case 1:
|
||||
return 2;
|
||||
case 2:
|
||||
return 3;
|
||||
case 3:
|
||||
return 4;
|
||||
case 4:
|
||||
return 6;
|
||||
case 5:
|
||||
return 8;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '我的订单',
|
||||
appBarBottom: PreferredSize(
|
||||
preferredSize: Size.fromHeight(88.w),
|
||||
child: BeeTabBar(
|
||||
scrollable: true, controller: _tabController, tabs: _tabs),
|
||||
),
|
||||
body: TabBarView(
|
||||
controller: _tabController,
|
||||
children: List.generate(
|
||||
_tabs.length,
|
||||
(index) => MyOrderView(
|
||||
index: _transIndes(index),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/models/market/order/my_order_list_model.dart';
|
||||
import 'package:aku_new_community/pages/things_page/widget/bee_list_view.dart';
|
||||
import 'package:aku_new_community/ui/market/order/my_order_card.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class MyOrderView extends StatefulWidget {
|
||||
final int index;
|
||||
|
||||
MyOrderView({Key? key, required this.index}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MyOrderViewState createState() => _MyOrderViewState();
|
||||
}
|
||||
|
||||
class _MyOrderViewState extends State<MyOrderView> {
|
||||
late EasyRefreshController _refreshController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_refreshController = EasyRefreshController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_refreshController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeListView(
|
||||
path: API.market.myOrderList,
|
||||
controller: _refreshController,
|
||||
extraParams: {"orderStart": widget.index},
|
||||
convert: (models) {
|
||||
return models.tableList!
|
||||
.map((e) => MyOrderListModel.fromJson(e))
|
||||
.toList();
|
||||
},
|
||||
builder: (items) {
|
||||
return ListView.separated(
|
||||
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||
itemBuilder: (context, index) {
|
||||
return MyOrderCard(
|
||||
model: items[index],
|
||||
callRefresh: () {
|
||||
_refreshController.callRefresh();
|
||||
},
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, __) {
|
||||
return 24.w.heightBox;
|
||||
},
|
||||
itemCount: items.length);
|
||||
});
|
||||
}
|
||||
}
|
@ -1,221 +0,0 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/constants/api.dart';
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_detail_page.dart';
|
||||
import 'package:aku_new_community/utils/headers.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class GoodsCard extends StatelessWidget {
|
||||
final GoodsItem item;
|
||||
final bool? border;
|
||||
|
||||
const GoodsCard({Key? key, required this.item, this.border})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
color: Colors.white,
|
||||
elevation: 0,
|
||||
shape: !(border ?? false)
|
||||
? null
|
||||
: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
side: BorderSide(color: Color(0xFFC4C4C4))),
|
||||
padding: EdgeInsets.zero,
|
||||
onPressed: () => Get.to(
|
||||
() => GoodsDetailPage(id: item.id),
|
||||
preventDuplicates: false,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12.w)),
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
FadeInImage.assetNetwork(
|
||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||
image: API.image(ImgModel.first(item.imgList)),
|
||||
fit: BoxFit.fill,
|
||||
imageErrorBuilder: (context, error, stackTrace) {
|
||||
return Image.asset(R.ASSETS_IMAGES_PLACEHOLDER_WEBP);
|
||||
},
|
||||
),
|
||||
Positioned(
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
child: Container(
|
||||
height: 38.w,
|
||||
color: Colors.black54,
|
||||
alignment: Alignment.centerLeft,
|
||||
padding: EdgeInsets.symmetric(horizontal: 12.w),
|
||||
child: Text(
|
||||
item.recommend,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: 16.w,
|
||||
right: 16.w,
|
||||
top: 10.w,
|
||||
),
|
||||
child: Text(
|
||||
item.title,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(fontSize: 28.sp, color: ktextPrimary),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: 16.w,
|
||||
right: 16.w,
|
||||
top: 10.w,
|
||||
),
|
||||
child: Container(
|
||||
child: _getIcon(1),
|
||||
)),
|
||||
10.hb,
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '¥',
|
||||
style: TextStyle(
|
||||
color: Colors.red,
|
||||
fontSize: 28.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '${item.sellingPrice} ',
|
||||
style: TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 40.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '原价:¥',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '${item.markingPrice}',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
decoration: TextDecoration.lineThrough,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.w,
|
||||
),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '折扣:',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: '9折',
|
||||
style: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getIcon(int type) {
|
||||
if (type == 1) {
|
||||
return Container(
|
||||
width: 86.w,
|
||||
height: 26.w,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(4.w),
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
begin: FractionalOffset.centerLeft,
|
||||
end: FractionalOffset.centerRight,
|
||||
colors: <Color>[Color(0xFFEC5329), Color(0xFFF58123)],
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'京东自营',
|
||||
style: TextStyle(fontSize: 18.sp, color: kForeGroundColor),
|
||||
),
|
||||
);
|
||||
} else if (type == 2) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
width: 86.w,
|
||||
height: 30.w,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(4.w),
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
begin: FractionalOffset.centerLeft,
|
||||
end: FractionalOffset.centerRight,
|
||||
colors: <Color>[Color(0xFFF59B1C), Color(0xFFF5AF16)],
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'京东POP',
|
||||
style: TextStyle(fontSize: 18.sp, color: kForeGroundColor),
|
||||
),
|
||||
);
|
||||
} else
|
||||
return SizedBox();
|
||||
}
|
||||
}
|
@ -1,106 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/buttons/bottom_button.dart';
|
||||
import 'package:aku_new_community/widget/picker/grid_image_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class AddSecondGoodsPage extends StatefulWidget {
|
||||
AddSecondGoodsPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_AddSecondGoodsPageState createState() => _AddSecondGoodsPageState();
|
||||
}
|
||||
|
||||
class _AddSecondGoodsPageState extends State<AddSecondGoodsPage> {
|
||||
late TextEditingController _titleController;
|
||||
late TextEditingController _contentController;
|
||||
List<File> _files = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_titleController = TextEditingController();
|
||||
_contentController = TextEditingController();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '添加商品',
|
||||
// actions: [
|
||||
// Padding(
|
||||
// padding: EdgeInsets.all(32.w),
|
||||
// child: '提交'.text.size(28.sp).color(ktextPrimary).make(),
|
||||
// ),
|
||||
// ],
|
||||
body: ListView(
|
||||
padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w),
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8.w)),
|
||||
width: double.infinity,
|
||||
padding: EdgeInsets.symmetric(vertical: 26.w, horizontal: 32.w),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _titleController,
|
||||
maxLines: 1,
|
||||
decoration: InputDecoration(
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Color(0xFFEEEEEE),
|
||||
width: 2.w,
|
||||
),
|
||||
),
|
||||
contentPadding: EdgeInsets.only(bottom: 10.w),
|
||||
isDense: true,
|
||||
hintText: '请输入标题',
|
||||
hintStyle: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 36.sp,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
20.w.heightBox,
|
||||
TextField(
|
||||
controller: _contentController,
|
||||
decoration: InputDecoration(
|
||||
border: InputBorder.none,
|
||||
contentPadding: EdgeInsets.zero,
|
||||
isDense: true,
|
||||
hintText: '请输入描述信息,至少五个字',
|
||||
hintStyle: TextStyle(
|
||||
color: ktextSubColor,
|
||||
fontSize: 28.sp,
|
||||
),
|
||||
),
|
||||
minLines: 5,
|
||||
maxLines: 10,
|
||||
),
|
||||
GridImagePicker(onChange: (files) {
|
||||
_files = files;
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
]),
|
||||
bottomNavi: BottomButton(
|
||||
onPressed: () {},
|
||||
child: '立即提交'.text.size(32.sp).color(ktextPrimary).bold.make(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
import 'package:aku_new_community/models/market/goods_item.dart';
|
||||
import 'package:aku_new_community/ui/market/goods/goods_card.dart';
|
||||
import 'package:aku_new_community/ui/market/second_hand/add_second_hand_goods_page.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:waterfall_flow/waterfall_flow.dart';
|
||||
|
||||
class SecondHandPage extends StatefulWidget {
|
||||
SecondHandPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SecondHandPageState createState() => _SecondHandPageState();
|
||||
}
|
||||
|
||||
class _SecondHandPageState extends State<SecondHandPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '二手市场',
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: Icon(
|
||||
CupertinoIcons.add_circled,
|
||||
),
|
||||
onPressed: () {
|
||||
Get.to(() => AddSecondGoodsPage());
|
||||
},
|
||||
),
|
||||
],
|
||||
body: WaterfallFlow.count(
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 20.w,
|
||||
crossAxisSpacing: 20.w,
|
||||
padding: EdgeInsets.all(32.w),
|
||||
children: [GoodsCard(item: GoodsItem.example())],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue