话费充值 历史记录(要更换接口,暂时搁置对接工作)

master
章文轩 4 years ago
parent c66c1191ce
commit 870f6af2ea

@ -29,6 +29,8 @@
<!--用于获取wifi的获取权限wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- 用于充值话费时获取通讯录的权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- tools:replace="android:name"-->
<!-- android:theme="@style/LaunchTheme" -->
<application

@ -63,6 +63,8 @@ PODS:
- DKPhotoGallery/Resource (0.0.17):
- SDWebImage
- SwiftyGif
- easy_contact_picker (0.0.1):
- Flutter
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
@ -70,7 +72,7 @@ PODS:
- flutter_bugly (0.0.1):
- Bugly
- Flutter
- flutter_ffmpeg/min-lts (0.4.0):
- flutter_ffmpeg/min-lts (0.4.2):
- Flutter
- mobile-ffmpeg-min (= 4.4.LTS)
- flutter_image_compress (0.0.1):
@ -261,6 +263,7 @@ DEPENDENCIES:
- clipboard_listener (from `.symlinks/plugins/clipboard_listener/ios`)
- device_info (from `.symlinks/plugins/device_info/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- easy_contact_picker (from `.symlinks/plugins/easy_contact_picker/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
@ -339,6 +342,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/device_info/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
easy_contact_picker:
:path: ".symlinks/plugins/easy_contact_picker/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
Flutter:
@ -422,10 +427,11 @@ SPEC CHECKSUMS:
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
easy_contact_picker: 9ab9dc70e8ddde6e76a19ffc482d7bf899868730
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
flutter_bugly: c9800f4d5bc5bdc27ffdde3417a26ba44266e0c3
flutter_ffmpeg: bc8496ea20331e486cd29a03a3c6ff10d32db565
flutter_ffmpeg: 3ec3912c74649851e6c3b1885511eef78142ac4f
flutter_image_compress: f69d0e0e078ce52b4810695593bc861ee319ae7d
flutter_qr_reader: 1b4faf9032e9ddc738107fd3dc067d29bd5cc67d
flutter_txugcupload: fd4f7a2a99e5fe30e608bf6f4acf0e7408339816

@ -53,7 +53,7 @@ class _TicketsOrderPageState extends State<TicketsOrderPage>
void initState() {
super.initState();
_ticketTypee = 1;
_tabController = TabController(length: 4, vsync: this,initialIndex:widget.firstTab );
_tabController = TabController(length: 4, vsync: this,initialIndex:widget.firstTab!=null?widget.firstTab:0 );
//startTick();
}

@ -0,0 +1,135 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:recook/constants/styles.dart';
import 'package:recook/manager/user_manager.dart';
import 'package:recook/pages/buy_tickets/add_used_passager_page.dart';
import 'package:recook/pages/buy_tickets/airplane_detail_page.dart';
import 'package:recook/pages/buy_tickets/functions/passager_func.dart';
import 'package:recook/pages/buy_tickets/models/passager_model.dart';
import 'package:recook/widgets/custom_app_bar.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/widgets/custom_image_button.dart';
import 'package:recook/widgets/no_data_view.dart';
import 'package:recook/widgets/refresh_widget.dart';
import 'package:velocity_x/velocity_x.dart';
class RechargeHistoryPage extends StatefulWidget {
RechargeHistoryPage({Key key}) : super(key: key);
@override
_RechargeHistoryPageState createState() => _RechargeHistoryPageState();
}
class _RechargeHistoryPageState extends State<RechargeHistoryPage> {
GSRefreshController _refreshController =
GSRefreshController(initialRefresh: true);
//List<Item> _passengerList = [];
// PassagerModel _passagerModel;
List<PassagerModel> _passengerList = [];
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.frenchColor,
appBar: CustomAppBar(
appBackground: Color(0xFFF9F9FB),
elevation: 0,
title: '常用旅客',
themeData: AppThemes.themeDataGrey.appBarTheme,
),
body: _bulidBody()
// _passengerList.length != 0
// ? _bulidBody()
// : NoDataView(
// title: '抱歉,您还没有添加任何常用旅客信息',
// ),
);
}
_bulidBody() {
return RefreshWidget(
controller: _refreshController,
onRefresh: () async {
_passengerList = await PassagerFunc.getPassagerList(
UserManager.instance.user.info.id);
setState(() {});
_refreshController.refreshCompleted();
},
body: ListView.separated(
padding: EdgeInsets.only(top: 10.rw),
separatorBuilder: (BuildContext context, int index) {
return Divider(
color: Color(0xFFEEEEEE),
height: 0.5.rw,
thickness: rSize(0.5),
indent: 15.rw,
);
},
physics: AlwaysScrollableScrollPhysics(),
itemCount: 5,//_passengerList.length,
itemBuilder: (context, index) {
return MaterialButton(
padding: EdgeInsets.zero,
onPressed: () async {
// String back = await Get.to(AddUsedPassagerPage(
// type: 2, item: _passengerList[index]));
// if (back == 'SUCCESS') {
// _refreshController.requestRefresh();
// }
},
child: _ticketsItem());
}),
);
}
_ticketsItem() {
return Container(
color: Colors.white,
height: 62.rw,
padding: EdgeInsets.symmetric(horizontal: 15.rw),
child: GestureDetector(
onTap: () {},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'话费充值',
style: TextStyle(fontSize: 16.rsp, color: Color(0xFF333333)),
),
Text(
'¥49.00',
style: TextStyle(fontSize: 16.rsp, color: Color(0xFF333333)),
),
],
),
10.hb,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'2021-08-31 17:00',
style: TextStyle(fontSize: 14.rsp, color: Color(0xFF666666)),
),
Text(
'充值话费¥50.00',
style: TextStyle(fontSize: 12.rsp, color: Color(0xFF999999)),
),
],
),
],
),
),
);
}
}

@ -1,13 +1,21 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:recook/pages/recharge/recharge_history_page.dart';
import 'package:recook/utils/permission_tool.dart';
import 'package:recook/widgets/alert.dart';
import 'package:recook/widgets/custom_app_bar.dart';
import 'package:get/get.dart';
import 'package:recook/constants/styles.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/widgets/recook_back_button.dart';
import 'package:recook/widgets/recook_indicator.dart';
import 'package:velocity_x/velocity_x.dart';
import 'package:easy_contact_picker/easy_contact_picker.dart';
class RechargePage extends StatefulWidget {
RechargePage({
@ -20,24 +28,98 @@ class RechargePage extends StatefulWidget {
class _RechargePageState extends State<RechargePage>
with TickerProviderStateMixin {
List<RechargeModel> _rechargeModelList = [];
TabController _tabController;
final EasyContactPicker _contactPicker = new EasyContactPicker();
Contact _contact = new Contact(fullName: "", phoneNumber: "");
List _list = [];
final items = [
BottomNavigationBarItem(
icon: Image.asset(R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,width: 18.rw,height: 19.rw,),
icon: Image.asset(
R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,
width: 18.rw,
height: 19.rw,
),
label: '订单',
),
];
String _phone = '';
int _choiceIndex = -1;
List _realPrice = [];
//
TextEditingController _phoneController = TextEditingController();
///2.
_getContactData() async {
Contact contact = await _contactPicker.selectContactWithNative();
setState(() {
_contact = contact;
print("contact==>${_contact.toString()}");
if (_contact.phoneNumber != '') {
RegExp exp = RegExp(r'^1\d{10}$');
bool matched = exp.hasMatch(_contact.phoneNumber);
if (matched) {
_phoneController.text = _getPhone(_contact.phoneNumber);
if(_phoneController.text.length==13){
_getRealPriceList();
}else{
_realPrice.clear();
}
_phoneController.selection = TextSelection.fromPosition(TextPosition(
offset: _phoneController.text.length,
affinity: TextAffinity.upstream));
} else {
Alert.show(
context,
NormalTextDialog(
type: NormalTextDialogType.normal,
title: "提示",
content: "手机格式号错误,请重新选择",
items: ["确认"],
listener: (index) {
Alert.dismiss(context);
},
));
}
}
});
}
_getRealPriceList(){
_realPrice = ['9,90','19.90','29.90','49.90','99.90','149.90','199.90'];
}
///
_getContactDataList() async {
List<Contact> list = await _contactPicker.selectContacts();
setState(() {
_list = list;
print("list==>${_list.toString()}");
});
}
///
_getPermission(Permission permission) async {
// var hasOpen = openAppSettings();
// print("hasOpen==>$hasOpen");
final status = await permission.request();
print("status==>$status");
}
@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
//RechargeModel rechargeModel = RechargeModel(price:'10',unit:'');
_rechargeModelList = [RechargeModel(price:'10',unit:''),RechargeModel(price:'20',unit:''),RechargeModel(price:'30',unit:''),
RechargeModel(price:'50',unit:'')
,RechargeModel(price:'100',unit:''),RechargeModel(price:'150',unit:''),RechargeModel(price:'200',unit:'')];
}
@override
void dispose() {
_tabController?.dispose();
super.dispose();
}
@ -60,20 +142,32 @@ class _RechargePageState extends State<RechargePage>
),
),
),
bottomNavigationBar: Container(
bottomNavigationBar:
GestureDetector(
onTap: (){
Get.to(RechargeHistoryPage());
},
child: Container(
width: double.infinity,
height: 48.rw,
color: Colors.white,
child: Column(
children: [
16.hb,
Image.asset(R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,width: 18.rw,height: 19.rw,),
Text('充值记录',style: TextStyle(color: Color(0xFF666666),fontSize: 10.rsp),)
],
Image.asset(
R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,
width: 18.rw,
height: 19.rw,
),
Text(
'充值记录',
style: TextStyle(color: Color(0xFF666666), fontSize: 10.rsp),
)
],
)),
),
body: Container(
child: _bodyWidget(),
),
);
@ -94,7 +188,6 @@ class _RechargePageState extends State<RechargePage>
top: 0,
left: 0,
child: Container(
width: 375.rw,
height: 150.rw,
color: Color(0xFF04C580),
@ -105,31 +198,28 @@ class _RechargePageState extends State<RechargePage>
TextField(
controller: _phoneController,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 2.rw, bottom: 4.rw,top: 30.rw),
contentPadding:
EdgeInsets.only(left: 2.rw, bottom: 4.rw, top: 30.rw),
hintText: '请输入11位手机号码',
counterText: '',
border: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.white,
width: 260.rw
),
borderSide:
BorderSide(color: Colors.white, width: 260.rw),
),
suffixIconConstraints: BoxConstraints(
minHeight: 17.rw,
minWidth: 17.rw,
),
suffixIcon:
Padding(
padding: EdgeInsets.all(5.rw),
suffixIcon: Padding(
padding: EdgeInsets.only(top: 30.rw),
child: GestureDetector(
onTap: () {
_phoneController.clear();
setState(() {
});
_realPrice.clear();
setState(() {});
},
child:_phone!=''?Container(
child: _phoneController.text != ''
? Container(
width: 17.rw,
height: 17.rw,
child: ImageIcon(
@ -137,77 +227,234 @@ class _RechargePageState extends State<RechargePage>
size: 17.rw,
color: Colors.white,
),
):SizedBox(),
)
: SizedBox(),
),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.white,
),
),
hintStyle:
AppTextStyle.generate(22.rsp, color: Color(0xFFFFFFFF)),
hintStyle: AppTextStyle.generate(22.rsp,
color: Color(0xFFFFFFFF)),
),
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
LengthLimitingTextInputFormatter(11), //
],
keyboardType: TextInputType.number,
style: AppTextStyle.generate(22.rsp, color: Colors.white),
maxLength: 11,
maxLines: 1,
onChanged: (text) {
if (text == null) return;
_phone = text;
_phoneController.text = _getPhone(_phone);
_phoneController.text = _getPhone(text);
_phoneController.selection = TextSelection.fromPosition(
TextPosition(
offset: _phoneController.text.length, affinity: TextAffinity.upstream));
setState(() {
});
offset: _phoneController.text.length,
affinity: TextAffinity.upstream));
print(_phoneController.text.length);
if(_phoneController.text.length==13){
_getRealPriceList();
}else{
_realPrice.clear();
}
setState(() {});
//print(_phone);
},
).expand(),
100.wb,
Container(
GestureDetector(
onTap: () async {
//_getPermission(Permission.contacts);
if (Platform.isIOS) {
_getContactData();
} else {
bool canUseContact =
await PermissionTool.haveContactPermission();
if (canUseContact) {
_getContactData();
}
}
},
child: Container(
padding: EdgeInsets.only(top: 34.rw),
child: Image.asset(R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,width: 19.rw,height: 22.rw,color: Colors.white,),
child: Image.asset(
R.ASSETS_TICKET_ORDER_TAB_ICON_PNG,
width: 19.rw,
height: 22.rw,
color: Colors.white,
),
),
),
60.wb,
],
),
),
),
Positioned(
top: 90.rw,
left: 15.rw,
right: 15.rw,
child: Container(
height: 295.rw,//_rechargeModelList.isNotEmpty&&_rechargeModelList.length>9?((_rechargeModelList.length~/3)-3)*74.rw+295.rw:295.rw,
width: 375.rw,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.rw),
),
child: Column(
children: [
_tabBarView(),
_ticketsList(),
],
),
)),
],
),
);
}
_tabBarView() {
return Container(
margin: EdgeInsets.symmetric(vertical: 10.rw),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(4.rw)),
alignment: Alignment.center,
child: TabBar(
labelPadding: EdgeInsets.symmetric(horizontal: 40.rw),
isScrollable: true,
controller: _tabController,
labelColor: Color(0xFF333333),
unselectedLabelColor: Color(0xFF333333).withOpacity(0.3),
labelStyle: TextStyle(
fontSize: 18.rsp,
fontWeight: FontWeight.w600,
),
unselectedLabelStyle: TextStyle(
fontSize: 18.rsp,
fontWeight: FontWeight.w400,
),
indicatorPadding: EdgeInsets.only(bottom: 12.rw),
indicatorSize: TabBarIndicatorSize.label,
indicator: RecookIndicator(
borderSide: BorderSide(
width: 6.rw,
color: Color(0xFF04C580),
),
60.wb,
//borderRadius: BorderRadius.circular(3.rw),
),
tabs: [
Tab(text: '充话费'),
Tab(text: '充流量'),
],
),
);
}
_tabViewItem(RechargeModel rechargeModel, int index, VoidCallback onPressed,int choiceIndex,String realPrice) {
return GestureDetector(
onTap: onPressed,
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
color: choiceIndex!=index?Colors.white:Color(0xFF04C580),
borderRadius: BorderRadius.circular(3.rw),
border: Border.all(width: 1.rw,color: Color(0xFFF1F1F1))
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
rechargeModel.price,
style: TextStyle(color: choiceIndex!=index? Color(0xFF333333):Colors.white, fontSize: 24.rsp),
),
Container(
padding: EdgeInsets.only(bottom: 2.rw),
child: Text(
rechargeModel.unit,
style: TextStyle(color: choiceIndex!=index? Color(0xFF333333):Colors.white, fontSize: 16.rsp,),
),
)
],
),
realPrice!=''?Text(
'售价' + realPrice + '',
style: TextStyle(color: choiceIndex!=index?Color(0xFF666666):Colors.white, fontSize: 12.rsp),
):SizedBox()
],
),
),
);
}
_ticketsList() {
return Container(
margin: EdgeInsets.symmetric(horizontal: 10.rw),
child: TabBarView(
controller: _tabController,
children: [
_phoneBill(),
_phoneBill(),
],
),
).expand();
}
//
_getPhone(String text) {
if (text.isEmpty) {
return text;
} else {
if (text.length <= 3) {
} else if (text.length > 3 && text.length < 8) {
text = text.insert(" ", 3);
} else if (text.length >= 8) {
text = text.insert(" ", 3);
text = text.insert(" ", 8);
}
return text;
}
}
_phoneBill(){
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
childAspectRatio: 95 / 64,
crossAxisSpacing: 15.rw,
mainAxisSpacing: 10.rw,
),
itemBuilder: (context, index) {
return _rechargeModelList.length > 0
? _tabViewItem(_rechargeModelList[index],index,(){
setState(() {
_choiceIndex = index;
}
);
},_choiceIndex,_realPrice.length==_rechargeModelList.length?_realPrice[index]:'')
: SizedBox();
},itemCount: _rechargeModelList.length,);
}
}
class RechargeModel{
String price;
String unit;
RechargeModel({
this.price,
this.unit,
});
}

@ -44,6 +44,15 @@ class PermissionTool {
return permission;
}
static Future<bool> haveContactPermission() async {
bool permission = await Permission.contacts.isGranted;
if (!permission) {
await Permission.contacts.request();
permission = await Permission.contacts.isGranted;
}
return permission;
}
static showOpenPermissionDialog(BuildContext context, String message,
{Function open ,String title}) {
Alert.show(

File diff suppressed because it is too large Load Diff

@ -98,6 +98,9 @@ dependencies:
# toast提示
oktoast: 2.3.2
# 通讯录选择
easy_contact_picker: ^0.0.2
# 应用信息
package_info: ^2.0.0

Loading…
Cancel
Save