diff --git a/assets/lottery_redeem/big_lottery.png b/assets/lottery_redeem/big_lottery.png new file mode 100644 index 0000000..6bd17fe Binary files /dev/null and b/assets/lottery_redeem/big_lottery.png differ diff --git a/assets/lottery_redeem/double_lottery.png b/assets/lottery_redeem/double_lottery.png new file mode 100644 index 0000000..5e5d747 Binary files /dev/null and b/assets/lottery_redeem/double_lottery.png differ diff --git a/assets/lottery_redeem/lottery_delete.png b/assets/lottery_redeem/lottery_delete.png new file mode 100644 index 0000000..97ae5df Binary files /dev/null and b/assets/lottery_redeem/lottery_delete.png differ diff --git a/assets/lottery_redeem/lottery_detail.png b/assets/lottery_redeem/lottery_detail.png new file mode 100644 index 0000000..072aa38 Binary files /dev/null and b/assets/lottery_redeem/lottery_detail.png differ diff --git a/assets/lottery_redeem/lottery_history.png b/assets/lottery_redeem/lottery_history.png new file mode 100644 index 0000000..bcaa09b Binary files /dev/null and b/assets/lottery_redeem/lottery_history.png differ diff --git a/assets/lottery_redeem/lottery_list.png b/assets/lottery_redeem/lottery_list.png new file mode 100644 index 0000000..3027eb1 Binary files /dev/null and b/assets/lottery_redeem/lottery_list.png differ diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index bcd94f7..16ff5d7 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -17,6 +17,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:oktoast/oktoast.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:recook/base/base_store_state.dart'; @@ -973,21 +974,26 @@ class _HomePageState extends BaseStoreState // AppRouter.push(context, RouteName.NEW_USER_DISCOUNT_PAGE); }), _buttonTitleRow( - AppConfig.getShowCommission() - ? "assets/home_menu_bb.png" - : "assets/listtemp_homelife_icon.png", - AppConfig.getShowCommission() ? "我的店铺" : "家居生活", - onPressed: () { - if (AppConfig.getShowCommission()) { - bool value = UserManager.instance.selectTabbar.value; - UserManager.instance.selectTabbar.value = !value; - UserManager.instance.selectTabbarIndex = 2; - } else { - AppRouter.push(context, RouteName.GOODS_LIST_TEMP, - arguments: GoodsListTempPage.setArguments( - title: "家居生活", type: GoodsListTempType.homeLife)); - } - }), + AppConfig.getShowCommission() + ? "assets/home_menu_bb.png" + : "assets/listtemp_homelife_icon.png", + AppConfig.getShowCommission() ? "我的店铺" : "家居生活", + onPressed: () { + showToast('⚠️需要处理打开逻辑'); + AppRouter.push(context, RouteName.REDEEM_LOTTERY_PAGE); + }, + // () { + // if (AppConfig.getShowCommission()) { + // bool value = UserManager.instance.selectTabbar.value; + // UserManager.instance.selectTabbar.value = !value; + // UserManager.instance.selectTabbarIndex = 2; + // } else { + // AppRouter.push(context, RouteName.GOODS_LIST_TEMP, + // arguments: GoodsListTempPage.setArguments( + // title: "家居生活", type: GoodsListTempType.homeLife)); + // } + // }, + ), _buttonTitleRow( AppConfig.getShowCommission() ? "assets/home_menu_cc.png" diff --git a/lib/pages/lottery/lottery_picker_page.dart b/lib/pages/lottery/lottery_picker_page.dart new file mode 100644 index 0000000..280da6f --- /dev/null +++ b/lib/pages/lottery/lottery_picker_page.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/header.dart'; +import 'package:recook/pages/lottery/widget/lottery_scaffold.dart'; + +class LotteryPickerPage extends StatefulWidget { + LotteryPickerPage({Key key}) : super(key: key); + + @override + _LotteryPickerPageState createState() => _LotteryPickerPageState(); +} + +class _LotteryPickerPageState extends State { + @override + Widget build(BuildContext context) { + return LotteryScaffold( + red: true, + title: Column( + children: [ + Text( + '双色球', + style: TextStyle( + color: Colors.white, + fontSize: rSP(18), + ), + ), + Text( + '明日', + style: TextStyle( + color: Colors.white, + fontSize: rSP(12), + ), + ), + ], + ), + actions: [ + MaterialButton( + minWidth: rSize(20), + onPressed: () {}, + child: Image.asset( + R.ASSETS_LOTTERY_REDEEM_LOTTERY_DETAIL_PNG, + width: rSize(20), + height: rSize(20), + ), + ), + MaterialButton( + minWidth: rSize(20), + onPressed: () {}, + child: Image.asset( + R.ASSETS_LOTTERY_REDEEM_LOTTERY_HISTORY_PNG, + width: rSize(20), + height: rSize(20), + ), + ), + ], + body: SizedBox(), + ); + } +} diff --git a/lib/pages/lottery/redeem_lottery_page.dart b/lib/pages/lottery/redeem_lottery_page.dart new file mode 100644 index 0000000..9de9fb7 --- /dev/null +++ b/lib/pages/lottery/redeem_lottery_page.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/header.dart'; +import 'package:recook/pages/lottery/widget/lottery_result_boxes.dart'; +import 'package:recook/pages/lottery/widget/lottery_scaffold.dart'; +import 'package:recook/widgets/custom_image_button.dart'; + +enum LotteryType { + DOUBLE_LOTTERY, + BIG_LOTTERY, +} + +class RedeemLotteryPage extends StatefulWidget { + RedeemLotteryPage({Key key}) : super(key: key); + + @override + _RedeemLotteryPageState createState() => _RedeemLotteryPageState(); +} + +class _RedeemLotteryPageState extends State { + @override + Widget build(BuildContext context) { + return LotteryScaffold( + title: '彩票兑换', + actions: [ + MaterialButton( + padding: EdgeInsets.symmetric(horizontal: rSize(16)), + minWidth: rSize(52), + onPressed: () {}, + child: Image.asset( + R.ASSETS_LOTTERY_REDEEM_LOTTERY_LIST_PNG, + width: rSize(20), + height: rSize(20), + ), + ), + ], + body: ListView( + children: [ + _lotteryCard( + type: LotteryType.DOUBLE_LOTTERY, + redBalls: [2, 6, 11, 14, 18, 22], + blueBalls: [02], + ), + _lotteryCard( + type: LotteryType.BIG_LOTTERY, + redBalls: [2, 6, 11, 14, 18], + blueBalls: [7, 12], + ), + ], + ), + ); + } + + _lotteryCard({ + LotteryType type, + List redBalls, + List blueBalls, + }) { + String title = type == LotteryType.DOUBLE_LOTTERY ? "双色球" : "大乐透"; + String asset = type == LotteryType.DOUBLE_LOTTERY + ? R.ASSETS_LOTTERY_REDEEM_DOUBLE_LOTTERY_PNG + : R.ASSETS_LOTTERY_REDEEM_BIG_LOTTERY_PNG; + + return CustomImageButton( + onPressed: () { + AppRouter.push(context, RouteName.LOTTERY_PICKER_PAGE); + }, + child: Container( + padding: EdgeInsets.all(rSize(16)), + margin: EdgeInsets.symmetric( + vertical: rSize(8), + horizontal: rSize(16), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(rSize(4)), + color: Colors.white, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Image.asset( + asset, + width: rSize(36), + height: rSize(36), + ), + SizedBox(width: rSize(10)), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + color: Color(0xFF333333), + fontSize: rSP(16), + ), + ), + Text( + 'DATE', + style: TextStyle( + color: Color(0xFF666666), + fontSize: rSP(12), + ), + ), + ], + ), + Spacer(), + Icon( + Icons.arrow_forward_ios, + color: Color(0xFFD7D7D7), + size: rSize(16), + ), + ], + ), + SizedBox(height: rSize(20)), + Row( + children: [ + Expanded( + child: LotteryResultBoxes( + type: type, + redBalls: redBalls, + blueBalls: blueBalls, + ), + ), + SizedBox(width: rSize(34)), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/lottery/widget/lottery_ball.dart b/lib/pages/lottery/widget/lottery_ball.dart new file mode 100644 index 0000000..c3ac542 --- /dev/null +++ b/lib/pages/lottery/widget/lottery_ball.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/header.dart'; + +enum LotteryColorType { + RED, + BLUE, +} + +class LotteryBall extends StatelessWidget { + final LotteryColorType type; + final int ball; + const LotteryBall({ + Key key, + @required this.type, + @required this.ball, + }) : super(key: key); + + String _computeBallDisplayValue() { + if (ball < 10) + return "0$ball"; + else + return "$ball"; + } + + @override + Widget build(BuildContext context) { + final isRed = type == LotteryColorType.RED; + return Container( + height: rSize(32), + width: rSize(32), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(rSize(16)), + color: isRed ? Color(0xFFE02020) : Color(0xFF0E89E7), + ), + alignment: Alignment.center, + child: Text( + _computeBallDisplayValue(), + style: TextStyle( + color: Colors.white, + fontSize: rSP(14), + ), + ), + ); + } +} diff --git a/lib/pages/lottery/widget/lottery_result_boxes.dart b/lib/pages/lottery/widget/lottery_result_boxes.dart new file mode 100644 index 0000000..eb64419 --- /dev/null +++ b/lib/pages/lottery/widget/lottery_result_boxes.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:recook/pages/lottery/redeem_lottery_page.dart'; +import 'package:recook/pages/lottery/widget/lottery_ball.dart'; + +class LotteryResultBoxes extends StatelessWidget { + final LotteryType type; + final List redBalls; + final List blueBalls; + const LotteryResultBoxes({Key key, this.type, this.redBalls, this.blueBalls}) + //红球数量限制 + : assert(redBalls.length == (type == LotteryType.DOUBLE_LOTTERY ? 6 : 5), + "红球数量错误"), + //篮球数量限制 + assert( + blueBalls.length == (type == LotteryType.DOUBLE_LOTTERY ? 1 : 2)), + super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: redBalls + .map( + (element) => LotteryBall(type: LotteryColorType.RED, ball: element), + ) + .toList() + ..addAll( + blueBalls.map( + (e) => LotteryBall(type: LotteryColorType.BLUE, ball: e), + ), + ), + ); + } +} diff --git a/lib/pages/lottery/widget/lottery_scaffold.dart b/lib/pages/lottery/widget/lottery_scaffold.dart new file mode 100644 index 0000000..09eb3c6 --- /dev/null +++ b/lib/pages/lottery/widget/lottery_scaffold.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/styles.dart'; +import 'package:recook/widgets/custom_app_bar.dart'; +import 'package:recook/widgets/recook_back_button.dart'; + +class LotteryScaffold extends StatefulWidget { + final dynamic title; + final bool red; + final List actions; + final Widget body; + final Widget bottomNavi; + LotteryScaffold({ + Key key, + @required this.title, + this.red = false, + this.actions, + this.body, + this.bottomNavi, + }) : super(key: key); + + @override + _LotteryScaffoldState createState() => _LotteryScaffoldState(); +} + +class _LotteryScaffoldState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color(0xFFF9F9FB), + appBar: CustomAppBar( + elevation: 0, + title: widget.title is String + ? Text( + widget.title, + style: TextStyle(color: AppColor.blackColor), + ) + : widget.title, + leading: RecookBackButton( + white: widget.red, + ), + appBackground: widget.red ? Color(0xFFE02020) : Color(0xFFF9F9FB), + actions: widget.actions, + ), + body: widget.body, + bottomNavigationBar: widget.bottomNavi, + ); + } +} diff --git a/lib/utils/app_router.dart b/lib/utils/app_router.dart index 6b6676e..2585fd9 100644 --- a/lib/utils/app_router.dart +++ b/lib/utils/app_router.dart @@ -26,6 +26,8 @@ import 'package:recook/pages/home/widget/goods_hot_list_page.dart'; import 'package:recook/pages/home/widget/goods_list_temp_page.dart'; import 'package:recook/pages/login/wechat_bind_page.dart'; import 'package:recook/pages/login/wechat_input_invitecode_page.dart'; +import 'package:recook/pages/lottery/lottery_picker_page.dart'; +import 'package:recook/pages/lottery/redeem_lottery_page.dart'; import 'package:recook/pages/shop/cumulative_income_page.dart'; import 'package:recook/pages/shop/member_benefits_page.dart'; import 'package:recook/pages/shop/order/shop_order_center_page.dart'; @@ -295,6 +297,12 @@ class RouteName { static const String SHARE_GOODS_POSTER_PAGE = "/ShareGoodsPosterPage"; static const String SHARE_URL_POSTER_PAGE = "/ShareUrlPosterPage"; static const String ABOUT_US_PAGE = "/AboutUsPage"; + + //彩票相关 + ///兑换彩票 + static const String REDEEM_LOTTERY_PAGE = "/ReddemLotteryPage"; + ///选择彩票 + static const String LOTTERY_PICKER_PAGE = "/LotteryPickerPage"; } typedef RouteBuilder = Widget Function(BuildContext context, @@ -596,6 +604,8 @@ final Map _routes = { InvoiceDetailInfomationPage( arguments: arguments, ), + RouteName.REDEEM_LOTTERY_PAGE: (context, {arguments}) => RedeemLotteryPage(), + RouteName.LOTTERY_PICKER_PAGE:(context,{arguments})=>LotteryPickerPage(), }; /// 应用中路由跳转 diff --git a/lib/widgets/recook_back_button.dart b/lib/widgets/recook_back_button.dart new file mode 100644 index 0000000..ebfaae2 --- /dev/null +++ b/lib/widgets/recook_back_button.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/app_image_resources.dart'; +import 'package:recook/constants/styles.dart'; + +class RecookBackButton extends StatelessWidget { + final bool white; + const RecookBackButton({Key key, this.white = false}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (Navigator.canPop(context)) { + return IconButton( + icon: Icon( + AppIcons.icon_back, + size: 17, + color: white ? Colors.white : AppColor.blackColor, + ), + onPressed: () { + Navigator.maybePop(context); + }); + } else + return SizedBox(); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 58b25f2..d831bfe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -211,6 +211,7 @@ flutter: - assets/share_bottom/ - assets/json/ - assets/lottery/ + - assets/lottery_redeem/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.io/assets-and-images/#resolution-aware.