You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
11 KiB
328 lines
11 KiB
import 'dart:io'; |
|
|
|
import 'package:flutter/cupertino.dart'; |
|
import 'package:flutter/material.dart'; |
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; |
|
import 'package:flutter_swiper/flutter_swiper.dart'; |
|
import 'package:huixiang/generated/l10n.dart'; |
|
import 'package:huixiang/retrofit/data/store_info.dart'; |
|
import 'package:huixiang/utils/flutter_utils.dart'; |
|
import 'package:huixiang/utils/font_weight.dart'; |
|
import 'package:huixiang/utils/location.dart'; |
|
import 'package:huixiang/view_widget/custom_image.dart'; |
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
import 'package:huixiang/view_widget/round_button.dart'; |
|
import 'package:url_launcher/url_launcher.dart'; |
|
|
|
class StoreInfos extends StatefulWidget { |
|
final StoreInfo storeInfo; |
|
|
|
StoreInfos(this.storeInfo); |
|
|
|
@override |
|
State<StatefulWidget> createState() { |
|
return _StoreInfos(); |
|
} |
|
} |
|
|
|
class _StoreInfos extends State<StoreInfos> { |
|
@override |
|
Widget build(BuildContext context) { |
|
return Container( |
|
margin: EdgeInsets.fromLTRB(17, 20, 15, 8), |
|
padding: EdgeInsets.fromLTRB(10, 20, 10, 14), |
|
width: double.infinity, |
|
decoration: BoxDecoration( |
|
color: Colors.white, |
|
borderRadius: BorderRadius.circular(8), |
|
boxShadow: [ |
|
BoxShadow( |
|
color: Colors.black.withAlpha(25), |
|
offset: Offset(0, 1), |
|
blurRadius: 12, |
|
spreadRadius: 0, |
|
), |
|
], |
|
), |
|
child: Row( |
|
mainAxisSize: MainAxisSize.min, |
|
children: [ |
|
Expanded( |
|
flex: 1, |
|
child: Column( |
|
mainAxisAlignment: MainAxisAlignment.start, |
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
children: [ |
|
Text( |
|
widget.storeInfo != null ? widget.storeInfo.storeName : "", |
|
overflow: TextOverflow.ellipsis, |
|
style: TextStyle( |
|
fontSize: 18.sp, |
|
color: Colors.black, |
|
fontWeight: MyFontWeight.medium, |
|
), |
|
), |
|
SizedBox( |
|
height: 8.h, |
|
), |
|
Row( |
|
children: [ |
|
Text( |
|
S.of(context).ren( |
|
widget.storeInfo != null |
|
? widget.storeInfo.perCapitaConsumption |
|
: "", |
|
), |
|
overflow: TextOverflow.ellipsis, |
|
style: TextStyle( |
|
fontSize: 14.sp, |
|
fontWeight: MyFontWeight.regular, |
|
color: Color(0xFF353535), |
|
), |
|
), |
|
SizedBox( |
|
width: 22.w, |
|
), |
|
Row( |
|
children: itemServer( |
|
widget.storeInfo != null |
|
? widget.storeInfo.businessService |
|
: "", |
|
), |
|
), |
|
], |
|
), |
|
SizedBox( |
|
height: 12.h, |
|
), |
|
Text( |
|
widget.storeInfo != null ? widget.storeInfo.address : "", |
|
maxLines: 2, |
|
textAlign: TextAlign.justify, |
|
style: TextStyle( |
|
color: Color(0xFF353535), |
|
fontWeight: MyFontWeight.regular, |
|
fontSize: 12.sp, |
|
), |
|
), |
|
SizedBox( |
|
height: 6.h, |
|
), |
|
Text( |
|
S.of(context).yingyeshijian(widget.storeInfo == null |
|
? "" |
|
: (widget.storeInfo.openStartTime == null && |
|
widget.storeInfo.openEndTime == null) |
|
? S.of(context).quantian |
|
: "${widget.storeInfo.openStartTime.substring(0, widget.storeInfo.openStartTime.lastIndexOf(":"))} " |
|
"- ${widget.storeInfo.openEndTime.substring(0, widget.storeInfo.openEndTime.lastIndexOf(":"))}"), |
|
style: TextStyle( |
|
color: Color(0xFF353535), |
|
fontWeight: MyFontWeight.regular, |
|
fontSize: 12.sp, |
|
), |
|
), |
|
], |
|
)), |
|
Column( |
|
children: [ |
|
MImage( |
|
widget.storeInfo != null ? widget.storeInfo.logo : "", |
|
width: 69, |
|
height: 69, |
|
fit: BoxFit.cover, |
|
errorSrc: "assets/image/default_1.webp", |
|
fadeSrc: "assets/image/default_1.webp", |
|
), |
|
SizedBox( |
|
height: 21.h, |
|
), |
|
Row( |
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
crossAxisAlignment: CrossAxisAlignment.end, |
|
children: [ |
|
InkWell( |
|
onTap: () { |
|
if (widget.storeInfo == null || |
|
widget.storeInfo.latitude == null || |
|
widget.storeInfo.longitude == null || |
|
widget.storeInfo.latitude == "" || |
|
widget.storeInfo.longitude == "") return; |
|
showMapSelect(); |
|
}, |
|
child: Image.asset( |
|
"assets/image/icon_union_location.webp", |
|
width: 24.w, |
|
height: 24.h, |
|
), |
|
), |
|
SizedBox( |
|
width: 16.w, |
|
), |
|
InkWell( |
|
onTap: () { |
|
showCallMobile(); |
|
}, |
|
child: Image.asset( |
|
"assets/image/icon_union_call.webp", |
|
width: 24, |
|
height: 24, |
|
), |
|
), |
|
], |
|
), |
|
], |
|
), |
|
], |
|
), |
|
); |
|
} |
|
|
|
Widget buildSwiper() { |
|
return Container( |
|
child: Swiper( |
|
pagination: SwiperPagination( |
|
alignment: Alignment.bottomCenter, |
|
builder: DotSwiperPaginationBuilder( |
|
size: 8.w, |
|
activeSize: 8.w, |
|
space: 5.w, |
|
activeColor: Colors.white, |
|
color: Colors.white.withAlpha(76), |
|
), |
|
), |
|
itemBuilder: (context, position) { |
|
return Container( |
|
margin: EdgeInsets.only(left: 10.w, right: 10.w), |
|
child: MImage( |
|
(widget.storeInfo != null && |
|
widget.storeInfo.bannerList != null && |
|
position < widget.storeInfo.bannerList.length) |
|
? widget.storeInfo.bannerList[position].imgUrl |
|
: "", |
|
fit: BoxFit.cover, |
|
radius: BorderRadius.circular(4), |
|
errorSrc: "assets/image/default_2_1.webp", |
|
fadeSrc: "assets/image/default_2_1.webp", |
|
), |
|
); |
|
}, |
|
itemCount: |
|
(widget.storeInfo != null && widget.storeInfo.bannerList != null) |
|
? widget.storeInfo.bannerList.length |
|
: 1), |
|
); |
|
} |
|
|
|
List<Widget> itemServer(String businessService) { |
|
if (businessService == null || businessService == "") return []; |
|
var list = businessService.split(","); |
|
return list |
|
.map((e) => Container( |
|
margin: EdgeInsets.only(right: 8.w), |
|
child: RoundButton( |
|
height: 14.h * AppUtils.textScale(context), |
|
text: "$e", |
|
backgroup: Color(0xFFFF7A1A), |
|
padding: EdgeInsets.only( |
|
left: 2.w, |
|
right: 2.w, |
|
), |
|
fontSize: 10.sp, |
|
textColor: Colors.white, |
|
), |
|
)) |
|
.toList(); |
|
} |
|
|
|
showCallMobile() { |
|
showCupertinoModalPopup( |
|
context: context, |
|
builder: (context) { |
|
return CupertinoActionSheet( |
|
title: Text(S.of(context).bodadianhua), |
|
actions: [ |
|
if (widget.storeInfo != null && |
|
widget.storeInfo.tel != null && |
|
widget.storeInfo.tel != "") |
|
CupertinoActionSheetAction( |
|
child: Text(widget.storeInfo.tel), |
|
onPressed: () { |
|
callMobile(widget.storeInfo.tel); |
|
Navigator.of(context).pop(); |
|
}, |
|
isDefaultAction: true, |
|
isDestructiveAction: false, |
|
), |
|
], |
|
cancelButton: CupertinoActionSheetAction( |
|
onPressed: () { |
|
Navigator.of(context).pop(); |
|
}, |
|
child: Text(S.of(context).quxiao), |
|
isDestructiveAction: true, |
|
), |
|
); |
|
}); |
|
} |
|
|
|
callMobile(mobile) async { |
|
String url = "tel:$mobile"; |
|
if (await canLaunch(url)) { |
|
await launch(url); |
|
} else { |
|
throw 'Could not launch $url'; |
|
} |
|
} |
|
|
|
showMapSelect() { |
|
showCupertinoModalPopup( |
|
context: context, |
|
builder: (context) { |
|
return CupertinoActionSheet( |
|
actions: [ |
|
CupertinoActionSheetAction( |
|
child: Text( |
|
"使用高德地图导航", |
|
style: TextStyle( |
|
fontWeight: MyFontWeight.regular, |
|
), |
|
), |
|
onPressed: () { |
|
onOpenBaiduMap(); |
|
Navigator.of(context).pop(); |
|
}, |
|
isDefaultAction: true, |
|
isDestructiveAction: false, |
|
), |
|
], |
|
cancelButton: CupertinoActionSheetAction( |
|
onPressed: () { |
|
Navigator.of(context).pop(); |
|
}, |
|
child: Text(S.of(context).quxiao, |
|
style: TextStyle( |
|
color: Colors.blue, |
|
),), |
|
isDestructiveAction: true, |
|
), |
|
); |
|
}); |
|
} |
|
|
|
void onOpenBaiduMap() async { |
|
LocationInstance.getInstance().startLocation(context, (locationData) { |
|
String url = "${Platform.isIOS ? 'ios' : 'android'}amap://path?sourceApplication=haixia&sid=" |
|
"&slat=${locationData.latitude.toStringAsFixed(8)}&slon=${locationData.longitude.toStringAsFixed(8)}&sname=&did=&dlat=${widget.storeInfo.latitude}&dlon=${widget.storeInfo.longitude}&dname=&dev=0&t=0"; |
|
launch(url).then((value) { |
|
if (!value) { |
|
SmartDialog.showToast( |
|
"未检测到安装高德地图", |
|
alignment: Alignment.center, |
|
); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
}
|
|
|