|
@@ -0,0 +1,544 @@
|
|
|
+import 'package:cpt_services/components/chooseAirConditionContent.dart';
|
|
|
+import 'package:cs_resources/generated/assets.dart';
|
|
|
+import 'package:cs_resources/theme/app_colors_theme.dart';
|
|
|
+import 'package:domain/entity/garage_sale_rent_detail_entity.dart';
|
|
|
+import 'package:domain/entity/garage_sale_rent_entity.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:auto_route/auto_route.dart';
|
|
|
+import 'package:flutter_hooks/flutter_hooks.dart';
|
|
|
+import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
|
+import 'package:plugin_basic/provider/app_config/app_config.dart';
|
|
|
+import 'package:plugin_basic/provider/app_config/app_config_service.dart';
|
|
|
+import 'package:plugin_platform/engine/image/image_preview.dart';
|
|
|
+import 'package:router/ext/auto_router_extensions.dart';
|
|
|
+import 'package:shared/utils/color_utils.dart';
|
|
|
+import 'package:shared/utils/ext_dart.dart';
|
|
|
+import 'package:shared/utils/log_utils.dart';
|
|
|
+import 'package:shared/utils/size_config.dart';
|
|
|
+import 'package:widgets/ext/ex_widget.dart';
|
|
|
+import 'package:widgets/load_state_layout.dart';
|
|
|
+import 'package:widgets/my_appbar.dart';
|
|
|
+import 'package:widgets/my_like_button.dart';
|
|
|
+import 'package:widgets/my_load_image.dart';
|
|
|
+import 'package:widgets/my_text_view.dart';
|
|
|
+import 'package:widgets/widget_export.dart';
|
|
|
+
|
|
|
+import '../../../components/chooseHouseCleanContent.dart';
|
|
|
+import '../../../components/user_evaluate_card_item.dart';
|
|
|
+import '../../../constants_services.dart';
|
|
|
+import 'service_clean_detail_vm.dart';
|
|
|
+
|
|
|
+import '../../../router/page/services_page_router.dart';
|
|
|
+
|
|
|
+@RoutePage()
|
|
|
+class ServiceCleanDetailPage extends HookConsumerWidget {
|
|
|
+ final int id;
|
|
|
+ final int serviceTypeCode;
|
|
|
+
|
|
|
+ const ServiceCleanDetailPage({Key? key,@PathParam('id') required this.id, @PathParam('serviceTypeCode') required this.serviceTypeCode}) : super(key: key);
|
|
|
+
|
|
|
+ static void startInstance({BuildContext? context, int? id, int? serviceTypeCode = 0}) {
|
|
|
+ if (context != null) {
|
|
|
+ context.router.push(ServiceCleanDetailPageRoute(id: id!, serviceTypeCode: serviceTypeCode!));
|
|
|
+ } else {
|
|
|
+ appRouter.push(ServiceCleanDetailPageRoute(id: id!, serviceTypeCode: serviceTypeCode!));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context, WidgetRef ref) {
|
|
|
+ final state = ref.watch(serviceCleanDetailVmProvider);
|
|
|
+ final vm = ref.read(serviceCleanDetailVmProvider.notifier);
|
|
|
+ final String pageTitle = 'Clean Details';
|
|
|
+ GlobalKey _likeButtonKey = GlobalKey<MyLikeButtonState>();
|
|
|
+
|
|
|
+ Map<String, dynamic>? detailInfo = state.datas?? null;
|
|
|
+ String title = detailInfo?['title']?? '';
|
|
|
+
|
|
|
+ useEffect((){
|
|
|
+ vm.setInitPageData(id: id, serviceTypeCode: serviceTypeCode,);
|
|
|
+
|
|
|
+ Future.microtask(() => vm.initPageData());
|
|
|
+ return () {
|
|
|
+
|
|
|
+ };
|
|
|
+ },[]);
|
|
|
+
|
|
|
+ return Scaffold(
|
|
|
+ appBar: MyAppBar.appBar(
|
|
|
+ context,
|
|
|
+ pageTitle,
|
|
|
+ backgroundColor: context.appColors.backgroundWhite,
|
|
|
+ ),
|
|
|
+ backgroundColor: context.appColors.backgroundDefault,
|
|
|
+ body: Column(
|
|
|
+ children: [
|
|
|
+ Expanded(
|
|
|
+ child: EasyRefresh(
|
|
|
+ controller: vm.refreshController,
|
|
|
+
|
|
|
+ onLoad: null,
|
|
|
+
|
|
|
+ onRefresh: () async{
|
|
|
+ Log.d("----onRefresh");
|
|
|
+ vm.onRefresh();
|
|
|
+ },
|
|
|
+
|
|
|
+ child: Stack(
|
|
|
+ children:[
|
|
|
+ LoadStateLayout(
|
|
|
+ state: state.loadingState,
|
|
|
+ errorMessage: state.errorMessage,
|
|
|
+ errorRetry: () {
|
|
|
+ vm.retryRequest();
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ successSliverWidget: [
|
|
|
+ SliverList(
|
|
|
+ delegate: SliverChildBuilderDelegate(
|
|
|
+ (context, index){
|
|
|
+ return detailInfo !=null ? _buildContentBox(context, ref, detailInfo): Container();
|
|
|
+ },
|
|
|
+ childCount: 1
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ Visibility(
|
|
|
+ visible: state.loadingState == LoadState.State_Success,
|
|
|
+ child: detailInfo !=null ? _buildBottomConcatInfo(context, ref, _likeButtonKey,
|
|
|
+ detailInfo:detailInfo,
|
|
|
+ ): Container(),
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildContentBox(BuildContext context, WidgetRef ref, Map<String, dynamic> detailInfo) {
|
|
|
+ List<String> resources = detailInfo?['resources'].cast<String>()??[];
|
|
|
+ String title = detailInfo?['title']??'';
|
|
|
+ double score = detailInfo?['score']?? 5.0;
|
|
|
+
|
|
|
+ final hilightStr = detailInfo?['hilightStr']??'On call, at the fastest 30 minutes to come to the door';
|
|
|
+
|
|
|
+
|
|
|
+ String description = detailInfo?['description']??'';
|
|
|
+ CarouselSliderController buttonCarouselController = CarouselSliderController();
|
|
|
+ return Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+
|
|
|
+ SizedBox(
|
|
|
+ width: SizeConfig().screenWidth,
|
|
|
+ height: 175,
|
|
|
+ child: CarouselSlider(
|
|
|
+ items: resources.map((resource) => MyLoadImage(
|
|
|
+ resource,
|
|
|
+ fit: BoxFit.cover,
|
|
|
+ width: SizeConfig().screenWidth,
|
|
|
+ height: 175,
|
|
|
+ ).onTap((){
|
|
|
+ ImagePreviewEngine.multipleImagePreview(
|
|
|
+ context,
|
|
|
+ resources,
|
|
|
+ heroes: List.generate(resources.length, (index) => resources[index]),
|
|
|
+ onLongPressAction: (url) {}
|
|
|
+ );
|
|
|
+ })
|
|
|
+ ).toList(),
|
|
|
+ carouselController: buttonCarouselController,
|
|
|
+ options: CarouselOptions(
|
|
|
+ autoPlay: false,
|
|
|
+ enlargeCenterPage: true,
|
|
|
+ viewportFraction: 1,
|
|
|
+ initialPage: 0,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+
|
|
|
+ Padding(
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16,),
|
|
|
+ child: hilightStr.isNotEmpty? MyTextView( hilightStr, fontSize: 13, isFontRegular: true, textColor: context.appColors.textDarkGray,):const SizedBox.shrink(),
|
|
|
+ ),
|
|
|
+
|
|
|
+ Column(
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ width: double.infinity,
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16,bottom: 16),
|
|
|
+ color: context.appColors.whiteBG,
|
|
|
+ child: Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "House Cleaning Services",
|
|
|
+ textColor: context.appColors.textBlack,
|
|
|
+ fontSize: 18,
|
|
|
+ isFontBold: true,
|
|
|
+ marginBottom: 5,
|
|
|
+ ),
|
|
|
+ Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.start,
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ AnimatedRatingStars(
|
|
|
+ initialRating: score,
|
|
|
+ onChanged: (rating) {
|
|
|
+ },
|
|
|
+ readOnly: true,
|
|
|
+ displayRatingValue: true,
|
|
|
+ interactiveTooltips: true,
|
|
|
+ customFilledIcon: Icons.star,
|
|
|
+ customHalfFilledIcon: Icons.star_half,
|
|
|
+ customEmptyIcon: Icons.star_border,
|
|
|
+ filledColor: ColorUtils.string2Color("#FF0000"),
|
|
|
+ starSize: 16.5,
|
|
|
+ animationDuration: const Duration(milliseconds: 0),
|
|
|
+ animationCurve: Curves.easeInOut,
|
|
|
+ ),
|
|
|
+ MyTextView(
|
|
|
+ "${score}",
|
|
|
+ textColor: context.appColors.textBlack,
|
|
|
+ fontSize: 16,
|
|
|
+ isFontMedium: true,
|
|
|
+ marginLeft: 15,
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ MyTextView(
|
|
|
+ "HONG YE GROUP PTE LTD",
|
|
|
+ textColor: context.appColors.textDarkGray999,
|
|
|
+ fontSize: 12,
|
|
|
+ isFontRegular: true,
|
|
|
+ marginTop: 10,
|
|
|
+ marginBottom: 5,
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+
|
|
|
+ _buildSelectHouseCleanOrAirConditioner(context, ref, detailInfo),
|
|
|
+
|
|
|
+ _buildUserReviews(context, ref, detailInfo),
|
|
|
+
|
|
|
+ Padding(
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
|
|
|
+ child: Column(
|
|
|
+ children: List.generate(6, (index) {
|
|
|
+
|
|
|
+ final Map<String, String> assetMap = {
|
|
|
+ 'serviceDetail01': Assets.serviceDetail01,
|
|
|
+ 'serviceDetail02': Assets.serviceDetail02,
|
|
|
+ 'serviceDetail03': Assets.serviceDetail03,
|
|
|
+ 'serviceDetail04': Assets.serviceDetail04,
|
|
|
+ 'serviceDetail05': Assets.serviceDetail05,
|
|
|
+ 'serviceDetail06': Assets.serviceDetail06,
|
|
|
+ };
|
|
|
+ String curDetailStr = 'serviceDetail0${(index + 1)}';
|
|
|
+ return MyAssetImage(
|
|
|
+ assetMap[curDetailStr]!,
|
|
|
+ width: SizeConfig().screenWidth,
|
|
|
+ fit: BoxFit.cover,
|
|
|
+ );
|
|
|
+ }).toList(),
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildUserReviews(BuildContext context, WidgetRef ref, Map<String, dynamic> detailInfo) {
|
|
|
+ final vm = ref.read(serviceCleanDetailVmProvider.notifier);
|
|
|
+ final state = ref.watch(serviceCleanDetailVmProvider);
|
|
|
+ int reviewScoreMaxNum = 3;
|
|
|
+ double reviewScoreItemCardHeight = 275;
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, dynamic> item = {
|
|
|
+ 'name': "User Sandy",
|
|
|
+ 'avatar': "",
|
|
|
+ 'score': 5.0,
|
|
|
+ 'card_created_at': "14 Oct 2024 15:00",
|
|
|
+ 'content': "This aunt is very careful because I haven't been home for three or four months. The house is",
|
|
|
+ 'resources': [],
|
|
|
+ };
|
|
|
+ return Container(
|
|
|
+ width: context.screenSize.width! * reviewScoreMaxNum,
|
|
|
+ height: reviewScoreItemCardHeight,
|
|
|
+ child: Column(
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16,bottom: 0),
|
|
|
+ color: context.appColors.whiteBG,
|
|
|
+ child: Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "User Reviews",
|
|
|
+ textColor: context.appColors.textBlack,
|
|
|
+ fontSize: 17,
|
|
|
+ isFontBold: true,
|
|
|
+ ),
|
|
|
+ MyTextView(
|
|
|
+ "All",
|
|
|
+ textColor: context.appColors.textDarkGray999,
|
|
|
+ fontSize: 14,
|
|
|
+ isFontRegular: true,
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ).onTap((){
|
|
|
+ vm.gotoUserReviewsPage(context, id, serviceTypeCode);
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ Expanded(
|
|
|
+ child: SingleChildScrollView(
|
|
|
+ scrollDirection: Axis.horizontal,
|
|
|
+ physics: const BouncingScrollPhysics(),
|
|
|
+ child: Container(
|
|
|
+ color: context.appColors.whiteBG,
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 0,bottom: 16),
|
|
|
+ child: Row(
|
|
|
+ children: List.generate(reviewScoreMaxNum, (index){
|
|
|
+ return _buildserviceEvaluateListItem(context, ref, item, vm, 300);
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildserviceEvaluateListItem(BuildContext context, WidgetRef ref, Map<String, dynamic> item, vm, double cardWidth){
|
|
|
+ String card_name = item?['name']?? "User Sandy";
|
|
|
+ String card_avatar = item?['avatar']?? "";
|
|
|
+ double card_score = item?['score']?? 5.0;
|
|
|
+ String card_created_at = item?['card_created_at']?? "14 Oct 2024 15:00";
|
|
|
+ String card_content = item.getValue("content", "This aunt is very careful because I haven't been home for three or four months. The house is");
|
|
|
+ List? card_resources = ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500','https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500','https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500','https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'];
|
|
|
+
|
|
|
+
|
|
|
+ return LayoutBuilder(
|
|
|
+ builder: (context, constraints) {
|
|
|
+ final maxWidth = constraints.maxWidth;
|
|
|
+ final maxHeight = constraints.maxHeight;
|
|
|
+
|
|
|
+ Log.d("55555 $cardWidth");
|
|
|
+ return Container(
|
|
|
+ margin: const EdgeInsets.only(top: 10),
|
|
|
+ width: cardWidth,
|
|
|
+ height: maxHeight,
|
|
|
+ child: Container(
|
|
|
+ margin: const EdgeInsets.only(right: 5),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: ColorUtils.string2Color("#F8F8F8"),
|
|
|
+ borderRadius: BorderRadius.circular(8),
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ),
|
|
|
+ child: Padding(
|
|
|
+ padding: const EdgeInsets.only(left: 15, right:15,top: 17, bottom: 17),
|
|
|
+ child: UserEvaluateCardItem(
|
|
|
+ key: UniqueKey(),
|
|
|
+ useInSence: 'cleanDetailPage',
|
|
|
+ name: card_name,
|
|
|
+ avator: card_avatar,
|
|
|
+ score: card_score,
|
|
|
+ time: card_created_at,
|
|
|
+ content: card_content,
|
|
|
+ contentTextMaxLines: 2,
|
|
|
+ imageUrls: card_resources,
|
|
|
+ ),
|
|
|
+
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildSelectHouseCleanOrAirConditioner(BuildContext context, WidgetRef ref, Map<String, dynamic> detailInfo) {
|
|
|
+ if(serviceTypeCode == servicesConstants.servicesType['houseCleaning']!['code']){
|
|
|
+
|
|
|
+ return Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+ Padding(
|
|
|
+ padding: const EdgeInsets.only(left: 16, right: 16,top: 10),
|
|
|
+ child: Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.start,
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ const MyAssetImage(
|
|
|
+ Assets.assetsYyHomeLogo,
|
|
|
+ width: 15,
|
|
|
+ height: 17.5,
|
|
|
+ ),
|
|
|
+ const SizedBox(
|
|
|
+ width: 10,
|
|
|
+ ),
|
|
|
+ MyTextView(
|
|
|
+ 'Service',
|
|
|
+ fontSize: 17,
|
|
|
+ isFontBold: true,
|
|
|
+ textColor: context.appColors.textBlack,
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ChooseHouseCleanContent(id: id, serviceTypeCode: serviceTypeCode,),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }else if(serviceTypeCode == servicesConstants.servicesType['airConditioner']!['code']){
|
|
|
+
|
|
|
+
|
|
|
+ }else if(serviceTypeCode == servicesConstants.servicesType['repaire']!['code']){
|
|
|
+
|
|
|
+ return SizedBox.shrink();
|
|
|
+ }
|
|
|
+ return SizedBox.shrink();
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget _buildBottomConcatInfo(
|
|
|
+ BuildContext context,
|
|
|
+ WidgetRef ref,
|
|
|
+ likeButtonKey,
|
|
|
+ {
|
|
|
+ required Map<String, dynamic> detailInfo,
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ final vm = ref.read(serviceCleanDetailVmProvider.notifier);
|
|
|
+
|
|
|
+ int? likes_count = detailInfo['likesCount']??0;
|
|
|
+ bool isLiked = detailInfo['isLiked']??false;
|
|
|
+ final contact = detailInfo['contact']??'+8613563656325';
|
|
|
+
|
|
|
+ final _likes_count = useState<int>(likes_count!);
|
|
|
+ final _isLiked = useState<bool>(isLiked);
|
|
|
+
|
|
|
+
|
|
|
+ return Container(
|
|
|
+ height: 50,
|
|
|
+ child: Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ mainAxisSize: MainAxisSize.max,
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ width: 122,
|
|
|
+ child: Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
+ mainAxisSize: MainAxisSize.max,
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ alignment: Alignment.center,
|
|
|
+ padding: const EdgeInsets.only(left:5, right: 0,top:5,bottom: 5),
|
|
|
+ child: Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ mainAxisSize: MainAxisSize.max,
|
|
|
+ children: [
|
|
|
+ MyLikeButton(
|
|
|
+ key: likeButtonKey,
|
|
|
+ isLiked: _isLiked.value,
|
|
|
+ isCustomIcon: true,
|
|
|
+ customIconUnActiveAssets: Assets.communityCollection,
|
|
|
+ customIconActiveAssets: Assets.communityLikeActive,
|
|
|
+ customIconWidth: 19,
|
|
|
+ customIconHeight: 18,
|
|
|
+ onLike: () async {
|
|
|
+ Log.d('点击了like button');
|
|
|
+ int id = detailInfo!['id'] as int;
|
|
|
+ final isSuccess = await vm.handlerClickCollection(context, id, true);
|
|
|
+ if(isSuccess!=null && isSuccess){
|
|
|
+
|
|
|
+ if(_isLiked.value){
|
|
|
+ Log.d("取消点赞");
|
|
|
+ _likes_count.value--;
|
|
|
+ _isLiked.value = false;
|
|
|
+ }else {
|
|
|
+ Log.d("点赞");
|
|
|
+ _likes_count.value++;
|
|
|
+ _isLiked.value = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ MyTextView(
|
|
|
+ "${_likes_count.value}",
|
|
|
+ fontSize: 18,
|
|
|
+ textColor: Colors.white,
|
|
|
+ isFontRegular: true,
|
|
|
+ marginLeft: 5,
|
|
|
+ marginRight: 15,
|
|
|
+ onClick: (){
|
|
|
+ final state = likeButtonKey.currentState;
|
|
|
+ state?.triggerTap();
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ const SizedBox(width: 4,),
|
|
|
+ const MyAssetImage(
|
|
|
+ Assets.communityPhone,
|
|
|
+ width: 21.5,
|
|
|
+ height: 18,
|
|
|
+ ).onTap((){
|
|
|
+ vm.handlerClickMobile(context, contact);
|
|
|
+ }),
|
|
|
+ const SizedBox(width: 15,),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ).backgroundColor(context.appColors.textPrimary),
|
|
|
+ ),
|
|
|
+ Expanded(
|
|
|
+ child: Container(
|
|
|
+ color: context.appColors.redDefault,
|
|
|
+ child: Center(
|
|
|
+ child: MyTextView(
|
|
|
+ 'Book Now',
|
|
|
+ textColor: context.appColors.textWhite,
|
|
|
+ fontSize: 17,
|
|
|
+ isFontMedium: true,
|
|
|
+ textAlign: TextAlign.center,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ).onTap((){
|
|
|
+ vm.handlerClickBookNow(context, id: id , serviceTypeCode: serviceTypeCode);
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|