diff --git a/assets/home_menu_bbb.png b/assets/home_menu_bbb.png new file mode 100644 index 0000000..1f480b0 Binary files /dev/null and b/assets/home_menu_bbb.png differ diff --git a/lib/pages/buy_tickets/add_used_passager_page.dart b/lib/pages/buy_tickets/add_used_passager_page.dart new file mode 100644 index 0000000..fdbcff5 --- /dev/null +++ b/lib/pages/buy_tickets/add_used_passager_page.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:recook/constants/styles.dart'; +import 'package:recook/pages/buy_tickets/airplane_detail_page.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:velocity_x/velocity_x.dart'; +import 'airplane_reserve_page.dart'; + +class AddUsedPassagerPage extends StatefulWidget { + final int type; + final Item item; + AddUsedPassagerPage({ + Key key, + @required this.type, + this.item, + }) : super(key: key); + + @override + _AddUsedPassagerPageState createState() => _AddUsedPassagerPageState(); +} + +class _AddUsedPassagerPageState extends State { + List _passengerList = []; + String _name = ''; + String _num = ''; + TextEditingController _controller1; + TextEditingController _controller2; + + @override + void initState() { + super.initState(); + print(widget.type); + if (widget.item != null) { + _controller1 = new TextEditingController(text: widget.item.item); + _controller2 = new TextEditingController(text: widget.item.num); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.frenchColor, + resizeToAvoidBottomInset: false, + appBar: CustomAppBar( + appBackground: Color(0xFFF9F9FB), + elevation: 0, + title: widget.type == 1 ? '添加常用旅客' : '编辑常用旅客', + themeData: AppThemes.themeDataGrey.appBarTheme, + ), + floatingActionButton: Container( + color: Colors.transparent, + padding: EdgeInsets.only(bottom: 25.rw), + width: 345.rw, + child: widget.type == 1 ? _addPassger() : _addDeletePassger(), + ), + body: _bulidBody(), + ); + } + + _bulidBody() { + return Column( + children: [ + _editItem('乘客姓名', '请输入乘客姓名', 1), + _divider(), + _editItem('证件类型', '身份证', 2), + _divider(), + _editItem('证件号码', '请填写证件号码', 3), + ], + ); + } + + _editItem(String head, String content, int type) { + return Container( + color: Colors.white, + height: 48.rw, + padding: EdgeInsets.symmetric(horizontal: 15.rw), + child: GestureDetector( + onTap: () {}, + child: Row( + children: [ + 10.wb, + Text( + head, + style: TextStyle(fontSize: 16.rsp, color: Color(0xFF333333)), + ), + 30.wb, + type != 2 + ? TextField( + decoration: InputDecoration( + contentPadding: EdgeInsets.only(left: 10.rw), + hintText: content, + border: InputBorder.none, + hintStyle: AppTextStyle.generate(14 * 2.sp, + color: Color(0xff666666)), + ), + controller: type == 1 ? _controller1 : _controller2, + keyboardType: + type == 3 ? TextInputType.number : TextInputType.text, + style: AppTextStyle.generate(14 * 2.sp), + maxLength: 18, + maxLines: 1, + onChanged: (text) { + if (type == 1) { + _name = text; + } else if (type == 3) { + _num = text; + } + }, + ).expand() + : Row( + children: [ + 20.wb, + Text( + content, + style: TextStyle( + fontSize: 14.rsp, color: Color(0xFF333333)), + ), + ], + ) + ], + ), + ), + ); + } + + _addPassger() { + return CustomImageButton( + height: 48.rw, + //padding: EdgeInsets.symmetric(vertical: 8), + title: "保存旅客信息", + backgroundColor: AppColor.themeColor, + color: Colors.white, + fontSize: 16 * 2.sp, + borderRadius: BorderRadius.all(Radius.circular(4.rw)), + onPressed: () {}, + ); + } + + _addDeletePassger() { + return Row( + children: [ + CustomImageButton( + height: 48.rw, + width: 116.rw, + //padding: EdgeInsets.symmetric(vertical: 8), + title: "删除", + backgroundColor: Colors.white, + color: AppColor.themeColor, + fontSize: 16 * 2.sp, + borderRadius: BorderRadius.all(Radius.circular(4.rw)), + border: Border.all(color: AppColor.themeColor, width: 1.rw), + onPressed: () {}, + ), + 20.wb, + CustomImageButton( + height: 48.rw, + width: 219.rw, + //padding: EdgeInsets.symmetric(vertical: 8), + title: "保存旅客信息", + backgroundColor: AppColor.themeColor, + color: Colors.white, + fontSize: 16 * 2.sp, + borderRadius: BorderRadius.all(Radius.circular(4.rw)), + onPressed: () {}, + ) + ], + ); + } + + _divider() { + return Divider( + color: Color(0xFFEEEEEE), + height: 0.5.rw, + thickness: rSize(0.5), + ); + } +} diff --git a/lib/pages/buy_tickets/airplane_detail_page.dart b/lib/pages/buy_tickets/airplane_detail_page.dart index 3678cbf..02c24b4 100644 --- a/lib/pages/buy_tickets/airplane_detail_page.dart +++ b/lib/pages/buy_tickets/airplane_detail_page.dart @@ -32,10 +32,6 @@ class _AirplaneDetailPageState extends State { .add(Item(item: '小星星', choice: false, num: '12345678901234567890')); _passengerList .add(Item(item: '吕小树', choice: false, num: '12345678901234567890')); - _passengerList - .add(Item(item: '吕小树', choice: false, num: '12345678901234567890')); - _passengerList - .add(Item(item: '吕小树', choice: false, num: '12345678901234567890')); } @override @@ -47,6 +43,7 @@ class _AirplaneDetailPageState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColor.frenchColor, + resizeToAvoidBottomInset: false, appBar: CustomAppBar( appBackground: Color(0xFFF9F9FB), elevation: 0, @@ -84,6 +81,7 @@ class _AirplaneDetailPageState extends State { _bottomTool(bool bottom) { return Container( height: 50.rw, + color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -253,6 +251,7 @@ class _AirplaneDetailPageState extends State { fit: BoxFit.cover, ), ), + 10.wb, Text( "联系电话", style: TextStyle(fontSize: 14.rsp, color: Color(0xFF333333)), @@ -260,8 +259,8 @@ class _AirplaneDetailPageState extends State { 20.wb, TextField( decoration: InputDecoration( - contentPadding: EdgeInsets.only(top: 10.rw, left: 20.rw), - hintText: '用于接受取票信息', + contentPadding: EdgeInsets.only(left: 20.rw, bottom: 4.rw), + hintText: '用于接收取票信息', border: InputBorder.none, hintStyle: AppTextStyle.generate(14 * 2.sp, color: Color(0xff666666)), @@ -428,7 +427,8 @@ class _AirplaneDetailPageState extends State { children: [ Container( padding: EdgeInsets.symmetric(horizontal: 15.rw), - height: 148.rw, + height: + _getHeight(_passengerList.length, _ChoosePassengerList.length), decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(4.rw)), color: Colors.white, @@ -445,6 +445,22 @@ class _AirplaneDetailPageState extends State { ).expand(); } + _getHeight(int top, int bottom) { + if (top < 5) { + if (bottom == 0) { + return 98.rw; + } else { + return 105.rw + bottom * 31.rw; + } + } else if (top > 5) { + if (bottom <= 8) { + return 105.rw + bottom * 31.rw + (top ~/ 4 - 1) * 53.rw; + } else { + return 105.rw + 8 * 31.rw + (top ~/ 4 - 1) * 53.rw; + } + } + } + Widget _getItemContainer( Item item, index, VoidCallback onPressed, bool selected) { return GestureDetector( @@ -452,21 +468,26 @@ class _AirplaneDetailPageState extends State { child: Container( width: 68.rw, height: 38.rw, + padding: EdgeInsets.only(top: 2.rw), decoration: BoxDecoration( - color: Colors.blue, + color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(3.rw)), border: Border.all( color: selected ? Color(0xFFD5101A) : Color(0xFF999999), width: 0.5.rw)), child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + selected ? MainAxisAlignment.end : MainAxisAlignment.center, children: [ Text( item.item, style: TextStyle(fontSize: 14.rsp, color: Color(0xFF666666)), ), + !selected ? 5.hb : SizedBox(), selected ? Container( + //color: Colors.yellow, + margin: EdgeInsets.only(left: 10.rw), alignment: Alignment.bottomRight, width: 68.rw, child: Container( @@ -480,7 +501,7 @@ class _AirplaneDetailPageState extends State { bottomRight: Radius.circular(3.rw)), ), child: Icon(CupertinoIcons.check_mark, - size: 20, color: Colors.white), + size: 10, color: Colors.white), ), ) : SizedBox(), @@ -542,11 +563,16 @@ class _AirplaneDetailPageState extends State { return _getItemContainer(_passengerList[index], index, () { setState(() { _passengerList[index].choice = !_passengerList[index].choice; - for (var i = 0; i < _passengerList.length; i++) { - if (_passengerList[i].choice) { - _ChoosePassengerList.add(_passengerList[i]); + if (_passengerList[index].choice) { + _ChoosePassengerList.add(_passengerList[index]); + } else { + if (_ChoosePassengerList.indexOf(_passengerList[index]) != + -1) { + _ChoosePassengerList.removeAt( + _ChoosePassengerList.indexOf(_passengerList[index])); } } + setState(() {}); }); }, _passengerList[index].choice); }, childCount: _passengerList.length), @@ -558,18 +584,24 @@ class _AirplaneDetailPageState extends State { )), SliverToBoxAdapter(child: 20.hb), SliverList( - delegate: SliverChildBuilderDelegate((content, index) { - return _getPassengerItem(_passengerList[index], index, () { - setState(() { - _passengerList[index].choice = !_passengerList[index].choice; - for (var i = 0; i < _passengerList.length; i++) { - if (_passengerList[i].choice) { - _ChoosePassengerList.add(_passengerList[i]); - } - } - }); - }); - }, childCount: 3), + delegate: _ChoosePassengerList.length != 0 + ? SliverChildBuilderDelegate((content, index) { + return _getPassengerItem(_ChoosePassengerList[index], index, + () { + setState(() { + _ChoosePassengerList[index].choice = + !_ChoosePassengerList[index].choice; + for (var i = 0; i < _ChoosePassengerList.length; i++) { + if (_ChoosePassengerList[i].choice) { + _ChoosePassengerList.add(_ChoosePassengerList[i]); + } + } + }); + }); + }, childCount: _ChoosePassengerList.length) + : SliverChildBuilderDelegate((content, index) { + return SizedBox(); + }, childCount: 0), ), SliverToBoxAdapter(child: 20.hb), ], diff --git a/lib/pages/buy_tickets/choose_tickets_type_page.dart b/lib/pages/buy_tickets/choose_tickets_type_page.dart index 4e9a5c5..336682b 100644 --- a/lib/pages/buy_tickets/choose_tickets_type_page.dart +++ b/lib/pages/buy_tickets/choose_tickets_type_page.dart @@ -6,6 +6,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:recook/constants/styles.dart'; +import 'package:recook/pages/buy_tickets/tickets_order_page.dart'; +import 'package:recook/pages/buy_tickets/used_passager_page.dart'; import 'package:recook/utils/permission_tool.dart'; import 'package:recook/widgets/alert.dart'; import 'package:recook/widgets/calendar/calendar_vertial_widget.dart'; @@ -27,6 +29,23 @@ class ChooseTicketsTypePage extends StatefulWidget { } class _ChooseTicketsTypePageState extends State { + final items = [ + BottomNavigationBarItem( + icon: Icon( + Icons.pages, + size: rSize(14), + color: Color(0xFF666666), + ), + title: Text('订单'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.pages, + size: rSize(14), + color: Color(0xFF666666), + ), + title: Text("常用旅客")), + ]; //按钮选中类型 int _chooseType = 1; //1为飞机票 2为汽车票 3为火车票 String _originText = '出发地'; @@ -74,9 +93,25 @@ class _ChooseTicketsTypePageState extends State { title: '瑞库客购票', themeData: AppThemes.themeDataGrey.appBarTheme, ), + bottomNavigationBar: BottomNavigationBar( + items: items, + onTap: onTap, + backgroundColor: Colors.white, + unselectedItemColor: Color(0xFF666666), + selectedItemColor: Color(0xFF666666), + type: BottomNavigationBarType.fixed, + ), body: _bodyWidget()); } + void onTap(int index) { + if (index == 0) { + Get.to(TicketsOrderPage()); + } else { + Get.to(UsedPassagerPage()); + } + } + _bodyWidget() { return Container( decoration: new BoxDecoration( diff --git a/lib/pages/buy_tickets/tickets_order_page.dart b/lib/pages/buy_tickets/tickets_order_page.dart new file mode 100644 index 0000000..5562afd --- /dev/null +++ b/lib/pages/buy_tickets/tickets_order_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class TicketsOrderPage extends StatefulWidget { + final String code; //飞机票标准商品编号 + TicketsOrderPage({Key key, this.code}) : super(key: key); + + @override + _TicketsOrderPageState createState() => _TicketsOrderPageState(); +} + +class _TicketsOrderPageState extends State { + @override + Widget build(BuildContext context) { + // TODO: implement build + throw UnimplementedError(); + } +} diff --git a/lib/pages/buy_tickets/used_passager_page.dart b/lib/pages/buy_tickets/used_passager_page.dart new file mode 100644 index 0000000..405662a --- /dev/null +++ b/lib/pages/buy_tickets/used_passager_page.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:recook/constants/styles.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/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:velocity_x/velocity_x.dart'; +import 'airplane_reserve_page.dart'; + +class UsedPassagerPage extends StatefulWidget { + UsedPassagerPage({Key key}) : super(key: key); + + @override + _UsedPassagerPageState createState() => _UsedPassagerPageState(); +} + +class _UsedPassagerPageState extends State { + List _passengerList = []; + + @override + void initState() { + super.initState(); + _passengerList + .add(Item(item: '张伟', choice: false, num: '12345678901234567890')); + _passengerList + .add(Item(item: '欧阳青青', choice: false, num: '12345678901234567')); + _passengerList + .add(Item(item: '小星星', choice: false, num: '12345678901234567890')); + _passengerList + .add(Item(item: '吕小树', choice: false, num: '12345678901234567890')); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.frenchColor, + appBar: CustomAppBar( + appBackground: Color(0xFFF9F9FB), + elevation: 0, + title: '常用旅客', + themeData: AppThemes.themeDataGrey.appBarTheme, + ), + floatingActionButton: Container( + color: Colors.transparent, + padding: EdgeInsets.only(bottom: 25.rw), + width: 345.rw, + child: _addPassger(), + ), + body: _passengerList.length != 0 + ? _bulidBody() + : NoDataView( + title: '抱歉,您还没有添加任何常用旅客信息', + ), + ); + } + + _bulidBody() { + return ListView.separated( + padding: EdgeInsets.only(bottom: 90.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: _passengerList.length, + itemBuilder: (context, index) { + return MaterialButton( + padding: EdgeInsets.zero, + onPressed: () { + Get.to( + AddUsedPassagerPage(type: 2, item: _passengerList[index])); + }, + child: _ticketsItem(_passengerList[index])); + }); + } + + _ticketsItem(Item item) { + return Container( + color: Colors.white, + height: 52.rw, + padding: EdgeInsets.symmetric(horizontal: 15.rw), + child: GestureDetector( + onTap: () {}, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + item.item, + style: TextStyle(fontSize: 16.rsp, color: Color(0xFF333333)), + ), + Icon(AppIcons.icon_next, size: 13.rw, color: Color(0xFF999999)), + ], + ), + ], + ), + ), + ); + } + + _addPassger() { + return CustomImageButton( + height: 48.rw, + //padding: EdgeInsets.symmetric(vertical: 8), + title: "添加旅客信息", + backgroundColor: AppColor.themeColor, + color: Colors.white, + fontSize: 16 * 2.sp, + borderRadius: BorderRadius.all(Radius.circular(4.rw)), + onPressed: () { + Get.to(AddUsedPassagerPage( + type: 1, + )); + }, + ); + } +} diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index b53cdd8..a362c6b 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -23,6 +23,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart' hide Response; import 'package:permission_handler/permission_handler.dart'; import 'package:power_logger/power_logger.dart'; +import 'package:recook/pages/live/pages/discovery_page.dart'; import 'package:sharesdk_plugin/sharesdk_plugin.dart'; import 'package:recook/base/base_store_state.dart'; @@ -88,6 +89,9 @@ class HomeAcitvityItem { } class HomePage extends StatefulWidget { + final TabController tabController; + + const HomePage({Key key, this.tabController}) : super(key: key); @override State createState() { return _HomePageState(); @@ -1030,13 +1034,18 @@ class _HomePageState extends BaseStoreState _buttonTitleRow( // R.ASSETS_LOTTERY_REDEEM_LOTTERY_ICON_PNG, AppConfig.getShowCommission() - ? R.ASSETS_HOME_MENU_BB_PNG + ? R.ASSETS_HOME_MENU_BBB_PNG : R.ASSETS_LISTTEMP_HOMELIFE_ICON_PNG, // AppConfig.getShowCommission() ? "我的店铺" : "家居生活", // '彩票兑换', - '彩票频道', + //2021 7,27 ios彩票审核不通过 隐藏彩票 + '精彩发现', onPressed: () { - AppRouter.push(context, RouteName.REDEEM_LOTTERY_PAGE); + //AppRouter.push(context, RouteName.REDEEM_LOTTERY_PAGE); + widget.tabController.animateTo(2); + UserManager.instance.selectTabbar.value = + !UserManager.instance.selectTabbar.value; + setState(() {}); }, // () { // if (AppConfig.getShowCommission()) { diff --git a/lib/pages/tabBar/TabbarWidget.dart b/lib/pages/tabBar/TabbarWidget.dart index 2426732..302006a 100644 --- a/lib/pages/tabBar/TabbarWidget.dart +++ b/lib/pages/tabBar/TabbarWidget.dart @@ -203,7 +203,9 @@ class _TabBarWidgetState extends State needAnimation: false, controller: _tabController, children: [ - HomePage(), + HomePage( + tabController: _tabController, + ), GoodsHotListPage(), DiscoveryPage(), // BusinessPage(), diff --git a/lib/widgets/no_data_view.dart b/lib/widgets/no_data_view.dart index 31c4610..b0038ff 100644 --- a/lib/widgets/no_data_view.dart +++ b/lib/widgets/no_data_view.dart @@ -31,9 +31,13 @@ class NoDataView extends StatelessWidget { child: Image.asset( AppImageName.img_no_data, )), - Text( - this.title, - style: AppTextStyle.generate(16, color: Colors.grey[400], fontWeight: FontWeight.w300), + Container( + alignment: Alignment.center, + child: Text( + this.title, + style: AppTextStyle.generate(16, + color: Colors.grey[400], fontWeight: FontWeight.w300), + ), ) ], ),