Merge branch 'newHost' of https://git.oa00.com/1281228557/aku_new_community into newHost
commit
25f3a85ef6
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 1.5 KiB |
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
class ConvenientPhoneModel {
|
|
||||||
int? id;
|
|
||||||
String? name;
|
|
||||||
String? tel;
|
|
||||||
|
|
||||||
ConvenientPhoneModel({this.id, this.name, this.tel});
|
|
||||||
|
|
||||||
ConvenientPhoneModel.fromJson(Map<String, dynamic> json) {
|
|
||||||
id = json['id'];
|
|
||||||
name = json['name'];
|
|
||||||
tel = json['tel'];
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
|
||||||
data['id'] = this.id;
|
|
||||||
data['name'] = this.name;
|
|
||||||
data['tel'] = this.tel;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,26 @@
|
|||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
part 'convenience_phone_model.g.dart';
|
||||||
|
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class ConveniencePhoneModel extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final String name;
|
||||||
|
final String tel;
|
||||||
|
final int type;
|
||||||
|
|
||||||
|
factory ConveniencePhoneModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$ConveniencePhoneModelFromJson(json);
|
||||||
|
|
||||||
|
const ConveniencePhoneModel({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.tel,
|
||||||
|
required this.type,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [id, name, tel, type,];
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'convenience_phone_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
ConveniencePhoneModel _$ConveniencePhoneModelFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
ConveniencePhoneModel(
|
||||||
|
id: json['id'] as int,
|
||||||
|
name: json['name'] as String,
|
||||||
|
tel: json['tel'] as String,
|
||||||
|
type: json['type'] as int,
|
||||||
|
);
|
@ -0,0 +1,33 @@
|
|||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
part 'integral_goods_list_model.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class IntegralGoodsListModel extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final String skuName;
|
||||||
|
final String mainPhoto;
|
||||||
|
final int points;
|
||||||
|
final int? saleNum;
|
||||||
|
|
||||||
|
factory IntegralGoodsListModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$IntegralGoodsListModelFromJson(json);
|
||||||
|
|
||||||
|
const IntegralGoodsListModel({
|
||||||
|
required this.id,
|
||||||
|
required this.skuName,
|
||||||
|
required this.mainPhoto,
|
||||||
|
required this.points,
|
||||||
|
this.saleNum,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
id,
|
||||||
|
skuName,
|
||||||
|
mainPhoto,
|
||||||
|
points,
|
||||||
|
saleNum,
|
||||||
|
];
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'integral_goods_list_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
IntegralGoodsListModel _$IntegralGoodsListModelFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
IntegralGoodsListModel(
|
||||||
|
id: json['id'] as int,
|
||||||
|
skuName: json['skuName'] as String,
|
||||||
|
mainPhoto: json['mainPhoto'] as String,
|
||||||
|
points: json['points'] as int,
|
||||||
|
saleNum: json['saleNum'] as int?,
|
||||||
|
);
|
@ -0,0 +1,37 @@
|
|||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
part 'trade_record_list_model.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class TradeRecordListModel extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final int type;
|
||||||
|
final String content;
|
||||||
|
final double payAmount;
|
||||||
|
final String createName;
|
||||||
|
final String createDate;
|
||||||
|
|
||||||
|
factory TradeRecordListModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$TradeRecordListModelFromJson(json);
|
||||||
|
|
||||||
|
|
||||||
|
const TradeRecordListModel({
|
||||||
|
required this.id,
|
||||||
|
required this.type,
|
||||||
|
required this.content,
|
||||||
|
required this.payAmount,
|
||||||
|
required this.createName,
|
||||||
|
required this.createDate,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
id,
|
||||||
|
type,
|
||||||
|
content,
|
||||||
|
payAmount,
|
||||||
|
createName,
|
||||||
|
createDate,
|
||||||
|
];
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'trade_record_list_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
TradeRecordListModel _$TradeRecordListModelFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
TradeRecordListModel(
|
||||||
|
id: json['id'] as int,
|
||||||
|
type: json['type'] as int,
|
||||||
|
content: json['content'] as String,
|
||||||
|
payAmount: (json['payAmount'] as num).toDouble(),
|
||||||
|
createName: json['createName'] as String,
|
||||||
|
createDate: json['createDate'] as String,
|
||||||
|
);
|
@ -1,73 +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/constants/saas_api.dart';
|
|
||||||
import 'package:aku_new_community/model/common/img_model.dart';
|
|
||||||
import 'package:aku_new_community/models/geographic_information/geographic_information_model.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_scaffold.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 GeographicInformationPage extends StatefulWidget {
|
|
||||||
GeographicInformationPage({
|
|
||||||
Key? key,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_GeographicInformationPageState createState() =>
|
|
||||||
_GeographicInformationPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _GeographicInformationPageState extends State<GeographicInformationPage> {
|
|
||||||
GeographicInformationModel _model = GeographicInformationModel.init();
|
|
||||||
bool _onload = true;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return BeeScaffold(
|
|
||||||
bodyColor: Colors.white,
|
|
||||||
title: '地理信息',
|
|
||||||
body: EasyRefresh(
|
|
||||||
firstRefresh: true,
|
|
||||||
header: MaterialHeader(),
|
|
||||||
onRefresh: () async {
|
|
||||||
BaseModel baseModel =
|
|
||||||
await NetUtil().get(API.manager.geographyInformation);
|
|
||||||
if (baseModel.success && baseModel.data != null) {
|
|
||||||
_model = GeographicInformationModel.fromJson(baseModel.data);
|
|
||||||
}
|
|
||||||
_onload = false;
|
|
||||||
setState(() {});
|
|
||||||
},
|
|
||||||
child: _onload
|
|
||||||
? Container()
|
|
||||||
: ListView(
|
|
||||||
children: [
|
|
||||||
SizedBox(
|
|
||||||
child: FadeInImage.assetNetwork(
|
|
||||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
image: SAASAPI.image(ImgModel.first(_model.imgUrls))),
|
|
||||||
width: double.infinity,
|
|
||||||
height: 424.w,
|
|
||||||
),
|
|
||||||
24.w.heightBox,
|
|
||||||
Padding(
|
|
||||||
padding:
|
|
||||||
EdgeInsets.only(left: 32.w, right: 32.w, top: 40.w),
|
|
||||||
child: Text(
|
|
||||||
_model.content ?? '',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 26.sp,
|
|
||||||
color: (ktextSubColor),
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,73 +1,70 @@
|
|||||||
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/constants/api.dart';
|
||||||
import 'package:aku_new_community/constants/saas_api.dart';
|
import 'package:aku_new_community/pages/one_alarm/alarm_detail_page.dart';
|
||||||
import 'package:aku_new_community/model/common/img_model.dart';
|
import 'package:aku_new_community/pages/one_alarm/widget/alarm_page.dart';
|
||||||
import 'package:aku_new_community/models/geographic_information/geographic_information_model.dart';
|
import 'package:aku_new_community/provider/app_provider.dart';
|
||||||
import 'package:aku_new_community/utils/network/base_model.dart';
|
import 'package:aku_new_community/utils/headers.dart';
|
||||||
import 'package:aku_new_community/utils/network/net_util.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/widget/bee_scaffold.dart';
|
||||||
|
import 'package:amap_flutter_base/amap_flutter_base.dart';
|
||||||
|
import 'package:amap_flutter_map/amap_flutter_map.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
import 'package:flutter_icons/flutter_icons.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:velocity_x/velocity_x.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
|
||||||
class GeographicInformationPage extends StatefulWidget {
|
class GeographicInformationPage extends StatefulWidget {
|
||||||
GeographicInformationPage({
|
GeographicInformationPage({Key? key}) : super(key: key);
|
||||||
Key? key,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_GeographicInformationPageState createState() =>
|
_GeographicInformationPageState createState() => _GeographicInformationPageState();
|
||||||
_GeographicInformationPageState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GeographicInformationPageState extends State<GeographicInformationPage> {
|
class _GeographicInformationPageState extends State<GeographicInformationPage> {
|
||||||
GeographicInformationModel _model = GeographicInformationModel.init();
|
AMapController? _mapController;
|
||||||
bool _onload = false;
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
PermissionUtil.getLocationPermission();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
_mapController?.disponse();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final appProvider = Provider.of<AppProvider>(context);
|
||||||
return BeeScaffold(
|
return BeeScaffold(
|
||||||
bodyColor: Colors.white,
|
|
||||||
title: '地理信息',
|
title: '地理信息',
|
||||||
body: EasyRefresh(
|
body: AMapWidget(
|
||||||
firstRefresh: true,
|
privacyStatement: AMapPrivacyStatement(
|
||||||
header: MaterialHeader(),
|
hasContains: true, hasShow: true, hasAgree: true),
|
||||||
onRefresh: () async {
|
onMapCreated: (controller) {
|
||||||
BaseModel baseModel =
|
final appProvider =
|
||||||
await NetUtil().get(API.manager.geographyInformation);
|
Provider.of<AppProvider>(context, listen: false);
|
||||||
if (baseModel.success && baseModel.data != null) {
|
LatLng _target = LatLng(
|
||||||
_model = GeographicInformationModel.fromJson(baseModel.data);
|
(appProvider.location?['latitude'] ?? 0) as double,
|
||||||
}
|
(appProvider.location?['longitude'] ?? 0) as double,
|
||||||
_onload = false;
|
);
|
||||||
setState(() {});
|
_mapController = controller;
|
||||||
|
_mapController!.moveCamera(
|
||||||
|
CameraUpdate.newCameraPosition(
|
||||||
|
CameraPosition(target: _target, zoom: 18),
|
||||||
|
),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
child: _onload
|
myLocationStyleOptions: MyLocationStyleOptions(
|
||||||
? Container()
|
true,
|
||||||
: ListView(
|
circleFillColor: Theme.of(context).primaryColor.withOpacity(0.2),
|
||||||
children: [
|
circleStrokeColor: Theme.of(context).primaryColor,
|
||||||
SizedBox(
|
|
||||||
child: FadeInImage.assetNetwork(
|
|
||||||
placeholder: R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
image: SAASAPI.image(ImgModel.first(_model.imgUrls))),
|
|
||||||
width: double.infinity,
|
|
||||||
height: 424.w,
|
|
||||||
),
|
),
|
||||||
24.w.heightBox,
|
|
||||||
Padding(
|
|
||||||
padding:
|
|
||||||
EdgeInsets.only(left: 32.w, right: 32.w, top: 40.w),
|
|
||||||
child: Text(
|
|
||||||
_model.content ?? '',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 26.sp,
|
|
||||||
color: (ktextSubColor),
|
|
||||||
fontWeight: FontWeight.bold),
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
));
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,213 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/models/wallet/trade_record_list_model.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_new_community/widget/picker/bee_date_picker.dart';
|
||||||
|
import 'package:aku_new_community/widget/picker/bee_picker_box.dart';
|
||||||
|
import 'package:common_utils/common_utils.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class BalanceRecordView extends StatefulWidget {
|
||||||
|
const BalanceRecordView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_BalanceRecordViewState createState() => _BalanceRecordViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BalanceRecordViewState extends State<BalanceRecordView> {
|
||||||
|
EasyRefreshController _refreshController = EasyRefreshController();
|
||||||
|
|
||||||
|
List<TradeRecordListModel> _models = [];
|
||||||
|
int _pageNum = 1;
|
||||||
|
int _size = 10;
|
||||||
|
DateTime _pickTime = DateTime.now();
|
||||||
|
int _pickType = 0;
|
||||||
|
|
||||||
|
Map<int, String> _types = {
|
||||||
|
1: '支付',
|
||||||
|
2: '退还',
|
||||||
|
3: '充值',
|
||||||
|
4: '收入',
|
||||||
|
5: '提现',
|
||||||
|
6: '抵扣',
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_refreshController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 32.w),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () async {
|
||||||
|
var date = await BeeDatePicker.monthPicker(
|
||||||
|
DateTime.now().subtract(Duration(days: 365)));
|
||||||
|
if (date != null) {
|
||||||
|
_pickTime = date;
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'${_pickTime.year}年${_pickTime.month}月'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
Icon(
|
||||||
|
CupertinoIcons.chevron_down,
|
||||||
|
size: 32.w,
|
||||||
|
color: Colors.black.withOpacity(0.45),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
MaterialButton(
|
||||||
|
color: Colors.black.withOpacity(0.06),
|
||||||
|
onPressed: () async {
|
||||||
|
await showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return BeePickerBox(
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: CupertinoPicker.builder(
|
||||||
|
itemExtent: 60.w,
|
||||||
|
childCount: _types.values.length,
|
||||||
|
onSelectedItemChanged: (index) {
|
||||||
|
_pickType = _types.keys.toList()[index];
|
||||||
|
},
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
var str = _types.values.toList()[index];
|
||||||
|
return Center(
|
||||||
|
child: str.text.size(32.sp).isIntrinsic.make(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shape: StadiumBorder(),
|
||||||
|
elevation: 0,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'${_pickType == 0 ? '全部类型' : _types[_pickType]}'
|
||||||
|
.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
Icon(
|
||||||
|
CupertinoIcons.chevron_down,
|
||||||
|
size: 24.w,
|
||||||
|
color: Colors.black.withOpacity(0.25),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: Container(
|
||||||
|
color: Colors.white,
|
||||||
|
child: EasyRefresh(
|
||||||
|
header: MaterialHeader(),
|
||||||
|
footer: MaterialFooter(),
|
||||||
|
firstRefresh: true,
|
||||||
|
controller: _refreshController,
|
||||||
|
onRefresh: () async {
|
||||||
|
_pageNum = 1;
|
||||||
|
var baseList = await NetUtil()
|
||||||
|
.getList(SAASAPI.balance.tradeRecordList, params: {
|
||||||
|
'pageNum': _pageNum,
|
||||||
|
'size': _size,
|
||||||
|
'modelType': 0,
|
||||||
|
'type': _pickType,
|
||||||
|
'createDate': _pickTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
_models = baseList.rows
|
||||||
|
.map((e) => TradeRecordListModel.fromJson(e))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
onLoad: () async {
|
||||||
|
_pageNum++;
|
||||||
|
var baseList = await NetUtil()
|
||||||
|
.getList(SAASAPI.balance.tradeRecordList, params: {
|
||||||
|
'pageNum': _pageNum,
|
||||||
|
'size': _size,
|
||||||
|
'modelType': 0,
|
||||||
|
'type': _pickType,
|
||||||
|
'createDate': _pickTime,
|
||||||
|
});
|
||||||
|
if (baseList.total > _models.length) {
|
||||||
|
_models.addAll(baseList.rows
|
||||||
|
.map((e) => TradeRecordListModel.fromJson(e))
|
||||||
|
.toList());
|
||||||
|
} else {
|
||||||
|
_refreshController.finishLoad(noMore: true);
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: ListView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w),
|
||||||
|
children: _models.map((e) => _buildCard(e)).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool incom(type) => [2, 3, 4].contains(type);
|
||||||
|
|
||||||
|
Widget _buildCard(TradeRecordListModel model) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
'${_types[model.type]}-${model.content}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
Spacer(),
|
||||||
|
'${incom(model.type) ? '+' : '-'}¥${model.payAmount}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(incom(model.type)
|
||||||
|
? Colors.red
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
8.hb,
|
||||||
|
'${DateUtil.formatDateStr(model.createDate, format: 'MM/dd HH:mm')}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:sms_autofill/sms_autofill.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class InputPayPasswordDialog extends StatefulWidget {
|
||||||
|
const InputPayPasswordDialog({
|
||||||
|
Key? key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_InputPayPasswordDialogState createState() => _InputPayPasswordDialogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _InputPayPasswordDialogState extends State<InputPayPasswordDialog> {
|
||||||
|
String? _currentCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: 300.w),
|
||||||
|
child: Material(
|
||||||
|
borderRadius: BorderRadius.circular(24.w),
|
||||||
|
child: Container(
|
||||||
|
width: 630.w,
|
||||||
|
height: 480.w,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
decoration: BoxDecoration(borderRadius: BorderRadius.circular(24.w)),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
96.hb,
|
||||||
|
'请输入您的支付密码'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
40.hb,
|
||||||
|
'支付密码仅用于对钱包余额支付时确认'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
PinFieldAutoFill(
|
||||||
|
autoFocus: true,
|
||||||
|
currentCode: _currentCode,
|
||||||
|
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||||
|
codeLength: 6,
|
||||||
|
onCodeChanged: (code) async {
|
||||||
|
if ((code?.length ?? 0) >= 6) {
|
||||||
|
Get.back(result: code!);
|
||||||
|
}
|
||||||
|
_currentCode = code;
|
||||||
|
},
|
||||||
|
decoration: UnderlineDecoration(
|
||||||
|
colorBuilder: FixedColorListBuilder([
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
])),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,247 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/gen/assets.gen.dart';
|
||||||
|
import 'package:aku_new_community/pages/life_pay/pay_util.dart';
|
||||||
|
import 'package:aku_new_community/pages/personal/wallet/input_pay_password_dialog.dart';
|
||||||
|
import 'package:aku_new_community/pages/personal/wallet/set_pay_password_dialog.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_new_community/widget/buttons/bee_check_radio.dart';
|
||||||
|
import 'package:aku_new_community/widget/buttons/bee_long_button.dart';
|
||||||
|
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class PayWayDialog extends StatefulWidget {
|
||||||
|
final bool isBalance;
|
||||||
|
final int amount;
|
||||||
|
final bool insufficientBalance;
|
||||||
|
|
||||||
|
const PayWayDialog(
|
||||||
|
{Key? key,
|
||||||
|
required this.isBalance,
|
||||||
|
required this.amount,
|
||||||
|
required this.insufficientBalance})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PayWayDialogState createState() => _PayWayDialogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PayWayDialogState extends State<PayWayDialog> {
|
||||||
|
List<int> _payType = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
if (widget.isBalance) {
|
||||||
|
_payType.add(1);
|
||||||
|
} else {
|
||||||
|
if (widget.insufficientBalance) {
|
||||||
|
_payType.add(1);
|
||||||
|
} else {
|
||||||
|
_payType.add(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var wallet = GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (widget.insufficientBalance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_payType.clear();
|
||||||
|
_payType.add(0);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: ClipRect(
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Assets.newIcon.walletBalance.image(width: 48.w, height: 48.w),
|
||||||
|
8.wb,
|
||||||
|
'钱包余额'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
16.wb,
|
||||||
|
Visibility(
|
||||||
|
visible: widget.insufficientBalance,
|
||||||
|
child:
|
||||||
|
'钱包余额不足'.text.size(24.sp).color(Colors.red).make()),
|
||||||
|
Spacer(),
|
||||||
|
BeeCheckRadio(
|
||||||
|
groupValue: _payType,
|
||||||
|
value: 0,
|
||||||
|
size: 36.w,
|
||||||
|
indent: Icon(
|
||||||
|
CupertinoIcons.checkmark_alt,
|
||||||
|
color: Colors.black,
|
||||||
|
size: 28.w,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BackdropFilter(
|
||||||
|
filter: ImageFilter.blur(
|
||||||
|
sigmaX: widget.insufficientBalance ? 1 : 0,
|
||||||
|
sigmaY: widget.insufficientBalance ? 1 : 0),
|
||||||
|
child: Container(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
var alipay = GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
_payType.clear();
|
||||||
|
_payType.add(1);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Assets.newIcon.alipay.image(width: 48.w, height: 48.w),
|
||||||
|
8.wb,
|
||||||
|
'支付宝'.text.size(28.sp).color(Colors.black.withOpacity(0.85)).make(),
|
||||||
|
Spacer(),
|
||||||
|
BeeCheckRadio(
|
||||||
|
groupValue: _payType,
|
||||||
|
value: 1,
|
||||||
|
size: 36.w,
|
||||||
|
indent: Icon(
|
||||||
|
CupertinoIcons.checkmark_alt,
|
||||||
|
color: Colors.black,
|
||||||
|
size: 28.w,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||||
|
width: double.infinity,
|
||||||
|
color: Colors.white,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
'支付'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.bold
|
||||||
|
.isIntrinsic
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
48.hb,
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
'¥'
|
||||||
|
.richText
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.size(26.sp)
|
||||||
|
.withTextSpanChildren([
|
||||||
|
widget.amount
|
||||||
|
.toString()
|
||||||
|
.textSpan
|
||||||
|
.size(40.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
]).make(),
|
||||||
|
Offstage(
|
||||||
|
offstage: widget.isBalance,
|
||||||
|
child: '总共购买${widget.amount * 10}积分'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
60.hb,
|
||||||
|
Offstage(
|
||||||
|
offstage: widget.isBalance,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
wallet,
|
||||||
|
40.hb,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
alipay,
|
||||||
|
80.hb,
|
||||||
|
BeeLongButton(
|
||||||
|
width: double.infinity,
|
||||||
|
onPressed: () async {
|
||||||
|
if (_payType.contains(0)) {
|
||||||
|
if (!UserTool
|
||||||
|
.userProvider.userInfoModel!.isBalancePayPwd) {
|
||||||
|
Get.dialog(SetPayPasswordDialog());
|
||||||
|
} else {
|
||||||
|
Get.back();
|
||||||
|
var psd = await Get.dialog(
|
||||||
|
InputPayPasswordDialog());
|
||||||
|
await NetUtil().post(
|
||||||
|
SAASAPI.balance.buyPointsByBalance,
|
||||||
|
params: {
|
||||||
|
'balance': widget.amount,
|
||||||
|
'balancePayPwd': psd
|
||||||
|
},
|
||||||
|
showMessage: true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_payType.contains(1)) {
|
||||||
|
var cancel = BotToast.showLoading();
|
||||||
|
await _alipayFuc();
|
||||||
|
cancel();
|
||||||
|
Get.back();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
text: '确认支付${widget.amount}元'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future _alipayFuc() async {
|
||||||
|
if (widget.isBalance) {
|
||||||
|
var base = await NetUtil().post(SAASAPI.pay.createBalanceOrder, params: {
|
||||||
|
'balance': widget.amount,
|
||||||
|
});
|
||||||
|
if (base.success) {
|
||||||
|
var re = await PayUtil()
|
||||||
|
.callAliPay(base.data, SAASAPI.pay.balanceOrderCheckAlipay);
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: base.msg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var base = await NetUtil().post(SAASAPI.pay.createPointsOrder, params: {
|
||||||
|
'payAmount': widget.amount,
|
||||||
|
});
|
||||||
|
if (base.success) {
|
||||||
|
var re = await PayUtil()
|
||||||
|
.callAliPay(base.data, SAASAPI.pay.pointsOrderCheckAlipay);
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: base.msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,212 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/models/wallet/trade_record_list_model.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_new_community/widget/picker/bee_date_picker.dart';
|
||||||
|
import 'package:aku_new_community/widget/picker/bee_picker_box.dart';
|
||||||
|
import 'package:common_utils/common_utils.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class PointRecordView extends StatefulWidget {
|
||||||
|
const PointRecordView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PointRecordViewState createState() => _PointRecordViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PointRecordViewState extends State<PointRecordView> {
|
||||||
|
EasyRefreshController _refreshController = EasyRefreshController();
|
||||||
|
|
||||||
|
List<TradeRecordListModel> _models = [];
|
||||||
|
int _pageNum = 1;
|
||||||
|
int _size = 10;
|
||||||
|
DateTime _pickTime = DateTime.now();
|
||||||
|
int _pickType = 0;
|
||||||
|
|
||||||
|
Map<int, String> _types = {
|
||||||
|
1: '支付',
|
||||||
|
2: '退还',
|
||||||
|
3: '充值',
|
||||||
|
4: '收入',
|
||||||
|
5: '提现',
|
||||||
|
6: '抵扣',
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_refreshController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 32.w),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () async {
|
||||||
|
var date = await BeeDatePicker.monthPicker(
|
||||||
|
DateTime.now().subtract(Duration(days: 365)));
|
||||||
|
if (date != null) {
|
||||||
|
_pickTime = date;
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'${_pickTime.year}年${_pickTime.month}月'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
Icon(
|
||||||
|
CupertinoIcons.chevron_down,
|
||||||
|
size: 32.w,
|
||||||
|
color: Colors.black.withOpacity(0.45),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
MaterialButton(
|
||||||
|
color: Colors.black.withOpacity(0.06),
|
||||||
|
onPressed: () async {
|
||||||
|
await showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return BeePickerBox(
|
||||||
|
onPressed: () {
|
||||||
|
Get.back();
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: CupertinoPicker.builder(
|
||||||
|
itemExtent: 60.w,
|
||||||
|
childCount: _types.values.length,
|
||||||
|
onSelectedItemChanged: (index) {
|
||||||
|
_pickType = _types.keys.toList()[index];
|
||||||
|
},
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
var str = _types.values.toList()[index];
|
||||||
|
return Center(
|
||||||
|
child: str.text.size(32.sp).isIntrinsic.make(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
shape: StadiumBorder(),
|
||||||
|
elevation: 0,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'${_pickType == 0 ? '全部类型' : _types[_pickType]}'
|
||||||
|
.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
Icon(
|
||||||
|
CupertinoIcons.chevron_down,
|
||||||
|
size: 24.w,
|
||||||
|
color: Colors.black.withOpacity(0.25),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: Container(
|
||||||
|
color: Colors.white,
|
||||||
|
child: EasyRefresh(
|
||||||
|
header: MaterialHeader(),
|
||||||
|
footer: MaterialFooter(),
|
||||||
|
firstRefresh: true,
|
||||||
|
controller: _refreshController,
|
||||||
|
onRefresh: () async {
|
||||||
|
_pageNum = 1;
|
||||||
|
var baseList = await NetUtil()
|
||||||
|
.getList(SAASAPI.balance.tradeRecordList, params: {
|
||||||
|
'pageNum': _pageNum,
|
||||||
|
'size': _size,
|
||||||
|
'modelType': 1,
|
||||||
|
'type': _pickType,
|
||||||
|
'createDate': _pickTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
_models = baseList.rows
|
||||||
|
.map((e) => TradeRecordListModel.fromJson(e))
|
||||||
|
.toList();
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
onLoad: () async {
|
||||||
|
_pageNum++;
|
||||||
|
var baseList = await NetUtil()
|
||||||
|
.getList(SAASAPI.balance.tradeRecordList, params: {
|
||||||
|
'pageNum': _pageNum,
|
||||||
|
'size': _size,
|
||||||
|
'modelType': 0,
|
||||||
|
'type': _pickType,
|
||||||
|
'createDate': _pickTime,
|
||||||
|
});
|
||||||
|
if (baseList.total > _models.length) {
|
||||||
|
_models.addAll(baseList.rows
|
||||||
|
.map((e) => TradeRecordListModel.fromJson(e))
|
||||||
|
.toList());
|
||||||
|
} else {
|
||||||
|
_refreshController.finishLoad(noMore: true);
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: ListView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w),
|
||||||
|
children: _models.map((e) => _buildCard(e)).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool incom(type) => [2, 3, 4].contains(type);
|
||||||
|
|
||||||
|
Widget _buildCard(TradeRecordListModel model) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
'${_types[model.type]}-${model.content}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
Spacer(),
|
||||||
|
'${incom(model.type) ? '+' : '-'}¥${model.payAmount}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(incom(model.type)
|
||||||
|
? Colors.red
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
8.hb,
|
||||||
|
'${DateUtil.formatDateStr(model.createDate, format: 'MM/dd HH:mm')}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/pages/personal/wallet/set_pay_password_verify_dialog.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:sms_autofill/sms_autofill.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class SetPayPasswordDialog extends StatefulWidget {
|
||||||
|
const SetPayPasswordDialog({Key? key, }) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_SetPayPasswordDialogState createState() => _SetPayPasswordDialogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SetPayPasswordDialogState extends State<SetPayPasswordDialog> {
|
||||||
|
String? _currentCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center(
|
||||||
|
child: Padding(
|
||||||
|
padding:EdgeInsets.only(bottom: 300.w),
|
||||||
|
child: Material(
|
||||||
|
borderRadius: BorderRadius.circular(24.w),
|
||||||
|
child: Container(
|
||||||
|
width: 630.w,
|
||||||
|
height: 480.w,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
decoration: BoxDecoration(borderRadius: BorderRadius.circular(24.w)),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
96.hb,
|
||||||
|
'请先设置支付密码'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
40.hb,
|
||||||
|
'支付密码仅用于对钱包余额支付时确认'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
PinFieldAutoFill(
|
||||||
|
autoFocus: true,
|
||||||
|
currentCode: _currentCode,
|
||||||
|
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||||
|
codeLength: 6,
|
||||||
|
onCodeChanged: (code) async {
|
||||||
|
if ((code?.length ?? 0) >= 6) {
|
||||||
|
Get.back();
|
||||||
|
Get.dialog(SetPayVerifyPasswordDialog(firstCode:code!,));
|
||||||
|
}
|
||||||
|
_currentCode = code;
|
||||||
|
},
|
||||||
|
decoration: UnderlineDecoration(
|
||||||
|
colorBuilder: FixedColorListBuilder([
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
])),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/pages/personal/wallet/input_pay_password_dialog.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/login/psd_verify.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:sms_autofill/sms_autofill.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class SetPayVerifyPasswordDialog extends StatefulWidget {
|
||||||
|
final String firstCode;
|
||||||
|
|
||||||
|
const SetPayVerifyPasswordDialog({Key? key, required this.firstCode})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_SetPayVerifyPasswordDialogState createState() =>
|
||||||
|
_SetPayVerifyPasswordDialogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SetPayVerifyPasswordDialogState
|
||||||
|
extends State<SetPayVerifyPasswordDialog> {
|
||||||
|
String _currentCode = '';
|
||||||
|
|
||||||
|
bool get checkVerify => widget.firstCode == _currentCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: 300.w),
|
||||||
|
child: Material(
|
||||||
|
borderRadius: BorderRadius.circular(24.w),
|
||||||
|
child: Container(
|
||||||
|
width: 630.w,
|
||||||
|
height: 480.w,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
decoration:
|
||||||
|
BoxDecoration(borderRadius: BorderRadius.circular(24.w)),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
96.hb,
|
||||||
|
'请再次输入支付密码'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
40.hb,
|
||||||
|
'支付密码仅用于对钱包余额支付时确认'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
PinFieldAutoFill(
|
||||||
|
autoFocus: true,
|
||||||
|
currentCode: _currentCode,
|
||||||
|
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||||
|
codeLength: 6,
|
||||||
|
onCodeChanged: (code) async {
|
||||||
|
_currentCode = code ?? '';
|
||||||
|
if ((code?.length ?? 0) >= 6) {
|
||||||
|
print(checkVerify);
|
||||||
|
if (!checkVerify) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var base = await NetUtil()
|
||||||
|
.post(SAASAPI.balance.setBalancePayPsd, params: {
|
||||||
|
'pwd': widget.firstCode,
|
||||||
|
'rePwd': _currentCode,
|
||||||
|
});
|
||||||
|
if (base.success) {
|
||||||
|
Get.back();
|
||||||
|
UserTool.userProvider.updateUserInfo();
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: base.msg);
|
||||||
|
Get.back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
decoration: UnderlineDecoration(
|
||||||
|
colorBuilder: FixedColorListBuilder([
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
])),
|
||||||
|
),
|
||||||
|
24.hb,
|
||||||
|
Offstage(
|
||||||
|
offstage: (_currentCode.isEmptyOrNull) || (checkVerify),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'密码输入不一致'
|
||||||
|
.text
|
||||||
|
.size(24.sp)
|
||||||
|
.isIntrinsic
|
||||||
|
.color(Colors.red)
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,496 @@
|
|||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/extensions/widget_list_ext.dart';
|
||||||
|
import 'package:aku_new_community/gen/assets.gen.dart';
|
||||||
|
import 'package:aku_new_community/pages/personal/wallet/pay_way_dialog.dart';
|
||||||
|
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:aku_new_community/widget/buttons/bee_long_button.dart';
|
||||||
|
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:collection/src/iterable_extensions.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_screenutil/src/size_extension.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/num_ext.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class WalletRechargePage extends StatefulWidget {
|
||||||
|
final initIndex;
|
||||||
|
|
||||||
|
const WalletRechargePage({Key? key, this.initIndex = 0}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_WalletRechargePageState createState() => _WalletRechargePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WalletRechargePageState extends State<WalletRechargePage>
|
||||||
|
with SingleTickerProviderStateMixin {
|
||||||
|
int _currentIndex = 0;
|
||||||
|
int _currentSelect = 0;
|
||||||
|
late TabController _tabController;
|
||||||
|
List<String> _tabs = ['余额充值', '积分充值'];
|
||||||
|
|
||||||
|
List<int> _balanceValue = [10, 20, 30, 50, 00, 200, 300, 500];
|
||||||
|
List<int> _pointValue = [10, 200, 300, 500, 1000, 2000, 5000, 10000];
|
||||||
|
|
||||||
|
int _rechargeValue = 0;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_tabController =
|
||||||
|
TabController(length: 2, vsync: this, initialIndex: widget.initIndex);
|
||||||
|
_currentIndex = widget.initIndex;
|
||||||
|
_rechargeValue = widget.initIndex == 0 ? _balanceValue[0] : _pointValue[0];
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '钱包充值',
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {},
|
||||||
|
child: '账单'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'余额:${UserTool.userProvider.userInfoModel!.balance ?? 0}'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
64.wb,
|
||||||
|
'积分:'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
'${UserTool.userProvider.userInfoModel!.points ?? 0}'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 32.w),
|
||||||
|
decoration: BoxDecoration(color: Colors.white),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: _tabs
|
||||||
|
.mapIndexed((index, element) => GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
_currentIndex = index;
|
||||||
|
_tabController.animateTo(_currentIndex);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
element.text
|
||||||
|
.size(28.sp)
|
||||||
|
.fontWeight(_currentIndex == index
|
||||||
|
? FontWeight.bold
|
||||||
|
: FontWeight.normal)
|
||||||
|
.color(Colors.black.withOpacity(
|
||||||
|
_currentIndex == index ? 0.85 : 0.65))
|
||||||
|
.make(),
|
||||||
|
8.hb,
|
||||||
|
AnimatedOpacity(
|
||||||
|
duration: Duration(microseconds: 500),
|
||||||
|
opacity: _currentIndex == index ? 1 : 0,
|
||||||
|
child: Container(
|
||||||
|
width: 40.w,
|
||||||
|
height: 8.w,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.black,
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.circular(4.w),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList()
|
||||||
|
.sepWidget(separate: 48.wb),
|
||||||
|
),
|
||||||
|
48.hb,
|
||||||
|
Expanded(
|
||||||
|
child: TabBarView(controller: _tabController, children: [
|
||||||
|
_balanceView(),
|
||||||
|
_pointView(),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
bottomNavi: Padding(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
left: 32.w,
|
||||||
|
right: 32.w,
|
||||||
|
bottom: 32.w + MediaQuery.of(context).padding.bottom),
|
||||||
|
child: BeeLongButton(
|
||||||
|
onPressed: () async {
|
||||||
|
if (_currentSelect == 9) {
|
||||||
|
_rechargeValue = 0;
|
||||||
|
Get.bottomSheet(_customValueDialog(_currentIndex == 0));
|
||||||
|
} else {
|
||||||
|
Get.bottomSheet(PayWayDialog(
|
||||||
|
isBalance: _currentIndex == 0,
|
||||||
|
amount: _rechargeValue,
|
||||||
|
insufficientBalance: _rechargeValue >
|
||||||
|
(UserTool.userProvider.userInfoModel!.balance ?? 0)));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
text: '下一步'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _balanceView() {
|
||||||
|
return GridView.count(
|
||||||
|
crossAxisCount: 3,
|
||||||
|
mainAxisSpacing: 20.w,
|
||||||
|
crossAxisSpacing: 20.w,
|
||||||
|
children: [
|
||||||
|
..._balanceValue
|
||||||
|
.mapIndexed((index, e) => _card(index, e, true))
|
||||||
|
.toList(),
|
||||||
|
_customValueCard(9, true)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _pointView() {
|
||||||
|
return GridView.count(
|
||||||
|
mainAxisSpacing: 20.w,
|
||||||
|
crossAxisSpacing: 20.w,
|
||||||
|
crossAxisCount: 3,
|
||||||
|
children: [
|
||||||
|
..._pointValue
|
||||||
|
.mapIndexed((index, element) => _card(index, element, false))
|
||||||
|
.toList(),
|
||||||
|
_customValueCard(9, false)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _card(int index, int value, bool isBalance) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
_currentSelect = index;
|
||||||
|
_rechargeValue = isBalance ? _balanceValue[index] : (_pointValue[index]~/10);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
borderRadius: BorderRadius.circular(16.w),
|
||||||
|
child: Stack(
|
||||||
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||||
|
fit: StackFit.passthrough,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: 214.w,
|
||||||
|
height: 202.w,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(16.w),
|
||||||
|
color:
|
||||||
|
_currentSelect != index ? Color(0xFFF9F9F9) : Colors.black,
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Offstage(
|
||||||
|
offstage: isBalance,
|
||||||
|
child: Assets.icons.intergral
|
||||||
|
.image(width: 48.w, height: 48.w)),
|
||||||
|
8.hb,
|
||||||
|
'$value '
|
||||||
|
.richText
|
||||||
|
.withTextSpanChildren([
|
||||||
|
'${isBalance ? '元' : '积分'} '
|
||||||
|
.textSpan
|
||||||
|
.size(26.sp)
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
])
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.size(40.w)
|
||||||
|
.make(),
|
||||||
|
16.hb,
|
||||||
|
Offstage(
|
||||||
|
offstage: isBalance,
|
||||||
|
child: '${value ~/ 10}元'
|
||||||
|
.text
|
||||||
|
.size(26.sp)
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
AnimatedPositioned(
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Offstage(
|
||||||
|
offstage: _currentSelect != index,
|
||||||
|
child: ClipPath(
|
||||||
|
clipper: _TriangleClipPath(),
|
||||||
|
child: Container(
|
||||||
|
width: 40.w,
|
||||||
|
height: 48.w,
|
||||||
|
color: Color(0xFFFBE541),
|
||||||
|
child: Transform.translate(
|
||||||
|
offset: Offset(10.w, 12.w),
|
||||||
|
child: Icon(
|
||||||
|
CupertinoIcons.checkmark_alt,
|
||||||
|
size: 24.w,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
duration: Duration(microseconds: 500))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _customValueCard(int index, bool isBalance) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
_currentSelect = index;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
borderRadius: BorderRadius.circular(16.w),
|
||||||
|
child: Stack(
|
||||||
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||||
|
fit: StackFit.passthrough,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: 214.w,
|
||||||
|
height: 202.w,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(16.w),
|
||||||
|
color:
|
||||||
|
_currentSelect != index ? Color(0xFFF9F9F9) : Colors.black,
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Offstage(
|
||||||
|
offstage: isBalance,
|
||||||
|
child: Assets.icons.intergral
|
||||||
|
.image(width: 48.w, height: 48.w)),
|
||||||
|
8.hb,
|
||||||
|
''
|
||||||
|
.richText
|
||||||
|
.withTextSpanChildren([
|
||||||
|
'${isBalance ? '其他金额' : '其他积分'} '
|
||||||
|
.textSpan
|
||||||
|
.size(26.sp)
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
])
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.size(40.w)
|
||||||
|
.make(),
|
||||||
|
16.hb,
|
||||||
|
Offstage(
|
||||||
|
offstage: isBalance,
|
||||||
|
child: '自定义'
|
||||||
|
.text
|
||||||
|
.size(26.sp)
|
||||||
|
.color(_currentSelect == index
|
||||||
|
? Color(0xFFFBE541)
|
||||||
|
: Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
AnimatedPositioned(
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Offstage(
|
||||||
|
offstage: _currentSelect != index,
|
||||||
|
child: ClipPath(
|
||||||
|
clipper: _TriangleClipPath(),
|
||||||
|
child: Container(
|
||||||
|
width: 40.w,
|
||||||
|
height: 48.w,
|
||||||
|
color: Color(0xFFFBE541),
|
||||||
|
child: Transform.translate(
|
||||||
|
offset: Offset(10.w, 12.w),
|
||||||
|
child: Icon(
|
||||||
|
CupertinoIcons.checkmark_alt,
|
||||||
|
size: 24.w,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
duration: Duration(microseconds: 500))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _customValueDialog(bool isBalance) {
|
||||||
|
return StatefulBuilder(
|
||||||
|
builder: (context, reSet) {
|
||||||
|
return Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||||
|
width: double.infinity,
|
||||||
|
color: Colors.white,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
'${isBalance ? '充值金额' : '充值积分'}'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.bold
|
||||||
|
.isIntrinsic
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
48.hb,
|
||||||
|
Container(
|
||||||
|
height: 88.w,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFF5F5F5),
|
||||||
|
borderRadius: BorderRadius.circular(16.w)),
|
||||||
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
24.wb,
|
||||||
|
'¥'
|
||||||
|
.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
12.wb,
|
||||||
|
Expanded(
|
||||||
|
child: TextField(
|
||||||
|
autofocus: true,
|
||||||
|
onChanged: (text) {
|
||||||
|
if (text.trim().isNotEmpty) {
|
||||||
|
_rechargeValue = int.parse(text);
|
||||||
|
reSet(() {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.digitsOnly
|
||||||
|
],
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
decoration: InputDecoration(border: InputBorder.none),
|
||||||
|
)),
|
||||||
|
Offstage(
|
||||||
|
offstage: isBalance,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Assets.icons.intergral
|
||||||
|
.image(width: 32.w, height: 32.w),
|
||||||
|
16.wb,
|
||||||
|
(_rechargeValue * 10)
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.855))
|
||||||
|
.make(),
|
||||||
|
12.wb,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
if (_rechargeValue == 0) {
|
||||||
|
BotToast.showText(text: '金额不能为0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Get.back();
|
||||||
|
Get.bottomSheet(PayWayDialog(
|
||||||
|
insufficientBalance: (UserTool.userProvider
|
||||||
|
.userInfoModel!.balance ??
|
||||||
|
0) <
|
||||||
|
_rechargeValue,
|
||||||
|
isBalance: isBalance,
|
||||||
|
amount: _rechargeValue));
|
||||||
|
},
|
||||||
|
child: Material(
|
||||||
|
child: Container(
|
||||||
|
width: 132.w,
|
||||||
|
color: Color(0xFFFBE541),
|
||||||
|
child: Center(
|
||||||
|
child: '去支付'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.85))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _TriangleClipPath extends CustomClipper<Path> {
|
||||||
|
@override
|
||||||
|
Path getClip(Size size) {
|
||||||
|
Path path = Path();
|
||||||
|
path.moveTo(0, size.height);
|
||||||
|
path.lineTo(size.width, size.height);
|
||||||
|
path.lineTo(size.width, 0 + 5.w);
|
||||||
|
path.lineTo(0, size.height);
|
||||||
|
path.close();
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
import 'package:aku_new_community/pages/personal/wallet/point_record_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/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'balance_record_view.dart';
|
||||||
|
|
||||||
|
class WalletTradeRecordPage extends StatefulWidget {
|
||||||
|
const WalletTradeRecordPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_WalletTradeRecordPageState createState() => _WalletTradeRecordPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WalletTradeRecordPageState extends State<WalletTradeRecordPage>
|
||||||
|
with SingleTickerProviderStateMixin {
|
||||||
|
List<String> _tabs = ['余额账单', '积分账单'];
|
||||||
|
late TabController _tabController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_tabController = TabController(length: _tabs.length, vsync: this);
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: BeeTabBar(
|
||||||
|
controller: _tabController,
|
||||||
|
tabs: _tabs,
|
||||||
|
scrollable: true,
|
||||||
|
),
|
||||||
|
body: TabBarView(
|
||||||
|
controller: _tabController,
|
||||||
|
children: [
|
||||||
|
BalanceRecordView(),
|
||||||
|
PointRecordView(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ClockTimerProvider extends ChangeNotifier{
|
||||||
|
///登录页验证码计时器
|
||||||
|
int second = 60;
|
||||||
|
bool timerStart = false;
|
||||||
|
Timer? timer;
|
||||||
|
|
||||||
|
void startTimer() {
|
||||||
|
timerStart = true;
|
||||||
|
timer = Timer.periodic(Duration(seconds: 1), (timer) {
|
||||||
|
if (second > 0) {
|
||||||
|
second--;
|
||||||
|
notifyListeners();
|
||||||
|
} else {
|
||||||
|
stopTimer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopTimer() {
|
||||||
|
second = 60;
|
||||||
|
timerStart = false;
|
||||||
|
timer?.cancel();
|
||||||
|
timer = null;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
@ -1,15 +1,81 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/saas_model/work_order/work_order_list_model.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:power_logger/power_logger.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/num_ext.dart';
|
||||||
|
|
||||||
|
import '../work_order_card.dart';
|
||||||
|
|
||||||
class AllOrderView extends StatefulWidget {
|
class AllOrderView extends StatefulWidget {
|
||||||
const AllOrderView({Key? key}) : super(key: key);
|
final EasyRefreshController refreshController;
|
||||||
|
final int index;
|
||||||
|
const AllOrderView(
|
||||||
|
{Key? key, required this.refreshController, required this.index})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_AllOrderViewState createState() => _AllOrderViewState();
|
_AllOrderViewState createState() => _AllOrderViewState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AllOrderViewState extends State<AllOrderView> {
|
class _AllOrderViewState extends State<AllOrderView>
|
||||||
|
with SingleTickerProviderStateMixin {
|
||||||
|
int _page = 1;
|
||||||
|
int _size = 10;
|
||||||
|
List<WorkOrderListModel> _models = [];
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container();
|
return EasyRefresh(
|
||||||
|
firstRefresh: true,
|
||||||
|
controller: widget.refreshController,
|
||||||
|
header: MaterialHeader(),
|
||||||
|
footer: MaterialFooter(),
|
||||||
|
onRefresh: () async {
|
||||||
|
_page = 1;
|
||||||
|
try {
|
||||||
|
var base = await NetUtil().getList(SAASAPI.workOrder.list, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'status': widget.index == 0 ? null : widget.index,
|
||||||
|
});
|
||||||
|
_models =
|
||||||
|
base.rows.map((e) => WorkOrderListModel.fromJson(e)).toList();
|
||||||
|
} catch (e) {
|
||||||
|
LoggerData.addData(e.toString());
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
onLoad: () async {
|
||||||
|
_page++;
|
||||||
|
var base = await NetUtil().getList(SAASAPI.workOrder.list, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'status': widget.index == 0 ? null : widget.index,
|
||||||
|
});
|
||||||
|
if (_models.length < base.total) {
|
||||||
|
_models.addAll(
|
||||||
|
base.rows.map((e) => WorkOrderListModel.fromJson(e)).toList());
|
||||||
|
setState(() {});
|
||||||
|
} else {
|
||||||
|
widget.refreshController.finishLoad(noMore: true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: _models.isEmpty
|
||||||
|
? Container()
|
||||||
|
: ListView.separated(
|
||||||
|
padding: EdgeInsets.all(24.w),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return WorkOrderCard(
|
||||||
|
model: _models[index],
|
||||||
|
refresh: widget.refreshController.callRefresh,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
return 24.w.heightBox;
|
||||||
|
},
|
||||||
|
itemCount: _models.length));
|
||||||
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,79 @@
|
|||||||
|
import 'package:aku_new_community/constants/saas_api.dart';
|
||||||
|
import 'package:aku_new_community/saas_model/work_order/work_order_list_model.dart';
|
||||||
|
import 'package:aku_new_community/ui/function_and_service/work_order/work_order_card.dart';
|
||||||
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:power_logger/power_logger.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/num_ext.dart';
|
||||||
|
|
||||||
|
class WorkOrderView extends StatefulWidget {
|
||||||
|
final EasyRefreshController refreshController;
|
||||||
|
final int index;
|
||||||
|
const WorkOrderView(
|
||||||
|
{Key? key, required this.refreshController, required this.index})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_WorkOrderViewState createState() => _WorkOrderViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WorkOrderViewState extends State<WorkOrderView> {
|
||||||
|
int _page = 1;
|
||||||
|
int _size = 10;
|
||||||
|
List<WorkOrderListModel> _models = [];
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return EasyRefresh(
|
||||||
|
firstRefresh: true,
|
||||||
|
controller: widget.refreshController,
|
||||||
|
header: MaterialHeader(),
|
||||||
|
footer: MaterialFooter(),
|
||||||
|
onRefresh: () async {
|
||||||
|
_page = 1;
|
||||||
|
try {
|
||||||
|
var base = await NetUtil().getList(SAASAPI.workOrder.list, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'status': widget.index == 0 ? null : widget.index,
|
||||||
|
});
|
||||||
|
_models =
|
||||||
|
base.rows.map((e) => WorkOrderListModel.fromJson(e)).toList();
|
||||||
|
} catch (e) {
|
||||||
|
LoggerData.addData(e.toString());
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
onLoad: () async {
|
||||||
|
_page++;
|
||||||
|
var base = await NetUtil().getList(SAASAPI.workOrder.list, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'status': widget.index == 0 ? null : widget.index,
|
||||||
|
});
|
||||||
|
if (_models.length < base.total) {
|
||||||
|
_models.addAll(
|
||||||
|
base.rows.map((e) => WorkOrderListModel.fromJson(e)).toList());
|
||||||
|
setState(() {});
|
||||||
|
} else {
|
||||||
|
widget.refreshController.finishLoad(noMore: true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: _models.isEmpty
|
||||||
|
? Container()
|
||||||
|
: ListView.separated(
|
||||||
|
padding: EdgeInsets.all(24.w),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return WorkOrderCard(
|
||||||
|
model: _models[index],
|
||||||
|
refresh: widget.refreshController.callRefresh,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
return 24.w.heightBox;
|
||||||
|
},
|
||||||
|
itemCount: _models.length));
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
import 'package:aku_new_community/extensions/num_ext.dart';
|
||||||
|
import 'package:aku_new_community/extensions/widget_list_ext.dart';
|
||||||
|
import 'package:aku_new_community/utils/application_utils.dart';
|
||||||
|
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/iterable_ext.dart';
|
||||||
|
import 'package:velocity_x/src/extensions/string_ext.dart';
|
||||||
|
|
||||||
|
class AllApplicationNewPage extends StatefulWidget {
|
||||||
|
const AllApplicationNewPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AllApplicationNewPageState createState() => _AllApplicationNewPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AllApplicationNewPageState extends State<AllApplicationNewPage> {
|
||||||
|
List<String> rootTypes = ['物业服务', '出行安全', '居民生活', '关于社区', '智慧服务', '附近市场'];
|
||||||
|
|
||||||
|
List<String> getApplications(int index) {
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
return ['报事报修', '设施预约', '生活缴费', '装修管理'];
|
||||||
|
case 1:
|
||||||
|
return [
|
||||||
|
'开门码',
|
||||||
|
'物品出门',
|
||||||
|
'地理信息',
|
||||||
|
'小蜜蜂任务',
|
||||||
|
];
|
||||||
|
case 2:
|
||||||
|
return ['便民电话', '问卷调查', '活动投票', '快递包裹', '投诉表扬', '业委会', '社区介绍', '借还管理'];
|
||||||
|
case 3:
|
||||||
|
return ['服务浏览', '周边企业', '住房说明', '电子商务'];
|
||||||
|
case 4:
|
||||||
|
return ['智慧养老', '任务发布', '周边服务', '共享投屏'];
|
||||||
|
case 5:
|
||||||
|
return ['自营商城', '邻家宠物', '共享停车', '二手市场'];
|
||||||
|
default:
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '全部应用',
|
||||||
|
body: ListView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 32.w),
|
||||||
|
children: rootTypes
|
||||||
|
.mapIndexed((e, index) => _applicationTile(index))
|
||||||
|
.toList()
|
||||||
|
.sepWidget(separate: 16.hb),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Container _applicationTile(int index) {
|
||||||
|
return Container(
|
||||||
|
width: 686.w,
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
vertical: 32.w,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(16.w)),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(left: 32.w, bottom: 24.w),
|
||||||
|
child: rootTypes[index]
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(Color(0xFF2B2B2B))
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
ConstrainedBox(
|
||||||
|
constraints: BoxConstraints(
|
||||||
|
maxHeight: getApplications(index).length ~/ 4 * 140.w +
|
||||||
|
((getApplications(index).length - 4) ~/ 4 * 30.w)),
|
||||||
|
child: GridView.count(
|
||||||
|
shrinkWrap: true,
|
||||||
|
crossAxisCount: 4,
|
||||||
|
physics: NeverScrollableScrollPhysics(),
|
||||||
|
children: ApplicationUtil(getApplications(index))
|
||||||
|
.elements
|
||||||
|
.map((e) => applicationItem(e))
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget applicationItem(AppElement appElement) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: appElement.onTap,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
appElement.imgPath,
|
||||||
|
width: 96.w,
|
||||||
|
height: 96.w,
|
||||||
|
),
|
||||||
|
8.hb,
|
||||||
|
appElement.title.text.size(24.sp).color(Color(0xFF333333)).make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,302 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
import 'package:aku_new_community/gen/assets.gen.dart';
|
||||||
|
import 'package:aku_new_community/pages/community_introduce/community_introduce_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/convenient_phone/convenient_phone_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/electronic_commerc/electronic_commerc_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/event_activity/event_voting_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/express_packages/express_package_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/geographic_information/geographic_information_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/goods_deto_page/goods_deto_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/goods_manage_page/select_borrow_return_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/house_introduce/house_introduce.dart';
|
||||||
|
import 'package:aku_new_community/pages/industry_committee/industry_committee_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/life_pay/life_pay_page_new.dart';
|
||||||
|
import 'package:aku_new_community/pages/opening_code_page/opening_code_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/renovation_manage/new_renovation/new_renovation_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/service_browse/service_browse_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/services/old_age/old_age_support_page_simple.dart';
|
||||||
|
import 'package:aku_new_community/pages/surrounding_enterprises/surrounding_enterprises_page.dart';
|
||||||
|
import 'package:aku_new_community/ui/community/facility/facility_appointment_page.dart';
|
||||||
|
import 'package:aku_new_community/ui/function_and_service/task/task_page.dart';
|
||||||
|
import 'package:aku_new_community/ui/function_and_service/work_order/work_order_page.dart';
|
||||||
|
import 'package:aku_new_community/ui/home/application/all_application.dart';
|
||||||
|
import 'package:aku_new_community/ui/manager/advice/advice_page.dart';
|
||||||
|
import 'package:aku_new_community/ui/manager/questionnaire/questionnaire_page.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class ApplicationUtil {
|
||||||
|
ApplicationUtil(this.titles);
|
||||||
|
|
||||||
|
List<String> titles = [];
|
||||||
|
|
||||||
|
List<AppElement> get elements {
|
||||||
|
var list = <AppElement>[];
|
||||||
|
this.titles.forEach((element) {
|
||||||
|
var re = _findByTitle(element);
|
||||||
|
if (re != null) {
|
||||||
|
list.add(re);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppElement? _findByTitle(String title) {
|
||||||
|
for (var item in allApplications) {
|
||||||
|
if (title == item.title) {
|
||||||
|
return item;
|
||||||
|
} else if (item.nickTitles.contains(title)) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<AppElement> get allApplications => [
|
||||||
|
AppElement(
|
||||||
|
title: '开门码',
|
||||||
|
imgPath: Assets.newIcon.icKmm.path,
|
||||||
|
onTap: () => Get.to(() => OpeningCodePage())),
|
||||||
|
// AppElement('访客邀请', R.ASSETS_ICONS_FUNC_FKYQ_PNG, () => Get.to(()=>VisitorAccessPage()),
|
||||||
|
AppElement(
|
||||||
|
title: '报事报修',
|
||||||
|
imgPath: Assets.home.icBsbx.path,
|
||||||
|
onTap: () => Get.to(() => WorkOrderPage())),
|
||||||
|
AppElement(
|
||||||
|
title: '生活缴费',
|
||||||
|
imgPath: Assets.home.icShjf.path,
|
||||||
|
onTap: () => Get.to(() => LifePayPageNew())),
|
||||||
|
AppElement(
|
||||||
|
title: '业委会',
|
||||||
|
imgPath: Assets.newIcon.icYwh.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(() => IndustryCommitteePage());
|
||||||
|
}),
|
||||||
|
// AppElement('建议咨询', R.ASSETS_ICONS_FUNC_JYZX_PNG,
|
||||||
|
// () => AdvicePage(type: AdviceType.SUGGESTION)),
|
||||||
|
AppElement(
|
||||||
|
title: '便民电话',
|
||||||
|
imgPath: Assets.newIcon.imgBmdh.path,
|
||||||
|
onTap: () {
|
||||||
|
Get.to(() => ConvenientPhonePage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '活动投票',
|
||||||
|
imgPath: Assets.newIcon.icHdtp.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(() => EventVotingPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '物品出门',
|
||||||
|
imgPath: Assets.newIcon.imgWpcm.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(() => GoodsDetoPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '投诉表扬',
|
||||||
|
imgPath: Assets.newIcon.icTsby.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(() => AdvicePage(type: AdviceType.COMPLAIN));
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '问卷调查',
|
||||||
|
imgPath: Assets.newIcon.icWjdc.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(() => QuestionnairePage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '装修管理',
|
||||||
|
imgPath: Assets.newIcon.imgZxgl.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => NewRenovationPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '借还管理',
|
||||||
|
imgPath: Assets.newIcon.icJhgl.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
Get.to(SelectBorrowReturnPage());
|
||||||
|
}),
|
||||||
|
// AppElement('一键报警', Assets.newIcon.yj, () => AlarmPage()),
|
||||||
|
AppElement(
|
||||||
|
title: '设施预约',
|
||||||
|
imgPath: Assets.home.icSsyy.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => FacilityAppointmentPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '快递包裹',
|
||||||
|
imgPath: Assets.newIcon.icKdbg.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => ExpressPackagePage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '电子商务',
|
||||||
|
imgPath: Assets.newIcon.icDzsw.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => ElectronicCommercPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '服务浏览',
|
||||||
|
imgPath: Assets.newIcon.icFwll.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => ServiceBrowsePage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '社区介绍',
|
||||||
|
imgPath: Assets.newIcon.icSqjs.path,
|
||||||
|
onTap: () {
|
||||||
|
Get.to(() => CommunityIntroducePage());
|
||||||
|
}),
|
||||||
|
// AppElement('家政服务', R.ASSETS_ICONS_FUNC_JZFW_PNG, () => HouseKeepingPage()),
|
||||||
|
|
||||||
|
AppElement(
|
||||||
|
title: '地理信息',
|
||||||
|
imgPath: Assets.newIcon.icDlxx.path,
|
||||||
|
onTap: () {
|
||||||
|
Get.to(() => GeographicInformationPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '周边企业',
|
||||||
|
imgPath: Assets.newIcon.icZbqy.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => SurroundingEnterprisesPage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '住房说明',
|
||||||
|
imgPath: Assets.newIcon.icRwsm.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能升级中,敬请期待');
|
||||||
|
return;
|
||||||
|
Get.to(() => HouseIntroducePage());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '智慧养老',
|
||||||
|
imgPath: Assets.home.icZhyl.path,
|
||||||
|
onTap: () {
|
||||||
|
Get.to(() => OldAgeSupportPageSimple());
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '周边服务',
|
||||||
|
imgPath: Assets.home.icZbfw.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '任务发布',
|
||||||
|
imgPath: Assets.home.icRwfb.path,
|
||||||
|
onTap: () => Get.to(() => TaskPage()),
|
||||||
|
nickTitles: ['小蜜蜂任务']),
|
||||||
|
AppElement(
|
||||||
|
title: '自营商城',
|
||||||
|
imgPath: Assets.newIcon.icZysc.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '邻家宠物',
|
||||||
|
imgPath: Assets.home.icLjcw.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '共享停车',
|
||||||
|
imgPath: Assets.newIcon.icGxtc.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '二手市场',
|
||||||
|
imgPath: Assets.newIcon.icEssc.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '共享投屏',
|
||||||
|
imgPath: Assets.newIcon.icGxtp.path,
|
||||||
|
onTap: () {
|
||||||
|
BotToast.showText(text: '此功能暂未上线');
|
||||||
|
return;
|
||||||
|
}),
|
||||||
|
AppElement(
|
||||||
|
title: '全部应用',
|
||||||
|
imgPath: Assets.home.icQbyy.path,
|
||||||
|
onTap: () => Get.to(() => AllApplicationPage())),
|
||||||
|
|
||||||
|
// AppElement(
|
||||||
|
// '小区教育',
|
||||||
|
// R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||||
|
// () => BeeScaffold(title: '小区教育'),
|
||||||
|
// ),
|
||||||
|
// AppElement(
|
||||||
|
// '健康运动',
|
||||||
|
// R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||||
|
// () => BeeScaffold(title: '健康运动'),
|
||||||
|
// ),
|
||||||
|
// AppElement(
|
||||||
|
// '家政服务',
|
||||||
|
// R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||||
|
// () => BeeScaffold(title: '家政服务'),
|
||||||
|
// ),
|
||||||
|
// AppElement(
|
||||||
|
// '居家养老',
|
||||||
|
// R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||||
|
// () => BeeScaffold(title: '居家养老'),
|
||||||
|
// ),
|
||||||
|
// AppElement(
|
||||||
|
// '物业租赁',
|
||||||
|
// R.ASSETS_IMAGES_PLACEHOLDER_WEBP,
|
||||||
|
// () => BeeScaffold(title: '物业租赁'),
|
||||||
|
// ),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppElement extends Equatable {
|
||||||
|
final String title;
|
||||||
|
final String imgPath;
|
||||||
|
final VoidCallback onTap;
|
||||||
|
final List<String> nickTitles;
|
||||||
|
|
||||||
|
const AppElement({
|
||||||
|
required this.title,
|
||||||
|
required this.imgPath,
|
||||||
|
required this.onTap,
|
||||||
|
this.nickTitles = const [],
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
title,
|
||||||
|
imgPath,
|
||||||
|
onTap,
|
||||||
|
];
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
import 'package:aku_new_community/saas_model/login/china_region_model.dart';
|
||||||
|
import 'package:aku_new_community/saas_model/login/picked_city_model.dart';
|
||||||
|
import 'package:aku_new_community/utils/hive_store.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import 'bee_picker_box.dart';
|
||||||
|
|
||||||
|
class BeeMonthPickBody extends StatefulWidget {
|
||||||
|
final DateTime initTime;
|
||||||
|
|
||||||
|
BeeMonthPickBody({Key? key, required this.initTime}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_BeeMonthPickBodyState createState() => _BeeMonthPickBodyState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BeeMonthPickBodyState extends State<BeeMonthPickBody> {
|
||||||
|
final FixedExtentScrollController _yearController =
|
||||||
|
FixedExtentScrollController();
|
||||||
|
final FixedExtentScrollController _monthController =
|
||||||
|
FixedExtentScrollController();
|
||||||
|
DateTime get _pickedTime => DateTime(_pickYear,_pickMonth) ;
|
||||||
|
|
||||||
|
List<int> get _years => List.generate(
|
||||||
|
DateTime.now().year - widget.initTime.year+1,
|
||||||
|
(index) => widget.initTime.year + index);
|
||||||
|
late int _pickYear;
|
||||||
|
late int _pickMonth;
|
||||||
|
|
||||||
|
List<int> get _months => List.generate(
|
||||||
|
_pickYear == DateTime.now().year ? DateTime.now().month : 12,
|
||||||
|
(index) => index + 1);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_pickYear = widget.initTime.year;
|
||||||
|
_pickMonth = 1;
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_yearController.dispose();
|
||||||
|
_monthController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeePickerBox(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context, _pickedTime);
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: CupertinoPicker(
|
||||||
|
itemExtent: 80.w,
|
||||||
|
magnification: 1.0,
|
||||||
|
looping: false,
|
||||||
|
scrollController: _yearController,
|
||||||
|
onSelectedItemChanged: (index) {
|
||||||
|
_pickYear = _years[index];
|
||||||
|
_pickMonth = 1;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
children: _years
|
||||||
|
.map((e) => Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 20.w),
|
||||||
|
child:
|
||||||
|
Text(e.toString()+'年', textAlign: TextAlign.center),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList()),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: CupertinoPicker(
|
||||||
|
itemExtent: 80.w,
|
||||||
|
magnification: 1.0,
|
||||||
|
// offAxisFraction: 0.6,
|
||||||
|
looping: true,
|
||||||
|
scrollController: _monthController,
|
||||||
|
onSelectedItemChanged: (index) {
|
||||||
|
_pickMonth = _months[index];
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
children: _months.isEmpty
|
||||||
|
? [Container()]
|
||||||
|
: _months
|
||||||
|
.map((e) => Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
left: 20.w,
|
||||||
|
right: 20.w,
|
||||||
|
top: 10.w,
|
||||||
|
bottom: 10.w),
|
||||||
|
child: Text(e.toString()+'月',
|
||||||
|
textAlign: TextAlign.center),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -1,19 +0,0 @@
|
|||||||
class Config {
|
|
||||||
///用户根目录
|
|
||||||
static const String homeDir = '/users/zhangmeng';
|
|
||||||
|
|
||||||
///包名
|
|
||||||
static const String packageName = 'aku_new_community';
|
|
||||||
|
|
||||||
///打包目录
|
|
||||||
static String get buildPath =>
|
|
||||||
'./build/app/outputs/flutter-apk/app-release.apk';
|
|
||||||
|
|
||||||
///测试包文件夹
|
|
||||||
static String get apkDevDir =>
|
|
||||||
'/users/zhangmeng/team/bee/app/aku_new_community/dev';
|
|
||||||
|
|
||||||
///正式包文件夹
|
|
||||||
static String get apkDir =>
|
|
||||||
'/users/zhangmeng/team/bee/app/aku_new_community/release';
|
|
||||||
}
|
|
Loading…
Reference in new issue