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.

1483 lines
52 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* ====================================================
* package : pages.home
* author : Created by nansi.
* time : 2019/5/5 4:36 PM
* remark :
* ====================================================
*/
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:amap_flutter_location/amap_flutter_location.dart';
import 'package:amap_flutter_location/amap_location_option.dart';
import 'package:clipboard_listener/clipboard_listener.dart';
import 'package:dio/dio.dart';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:recook/base/base_store_state.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/daos/home_dao.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/manager/meiqia_manager.dart';
import 'package:recook/manager/user_manager.dart';
import 'package:recook/models/banner_list_model.dart';
import 'package:recook/models/base_model.dart';
import 'package:recook/models/goods_detail_model.dart' as GDM;
import 'package:recook/models/home_weather_model.dart';
import 'package:recook/models/promotion_goods_list_model.dart';
import 'package:recook/models/promotion_list_model.dart';
import 'package:recook/pages/home/classify/brandgoods_list_page.dart';
import 'package:recook/pages/home/classify/classify_page.dart';
import 'package:recook/pages/home/classify/commodity_detail_page.dart';
import 'package:recook/pages/home/classify/mvp/goods_detail_model_impl.dart';
import 'package:recook/pages/home/home_page_tabbar.dart';
import 'package:recook/pages/home/items/item_row_acitivity.dart';
import 'package:recook/pages/home/promotion_time_tool.dart';
import 'package:recook/pages/home/widget/animated_home_background.dart';
import 'package:recook/pages/home/widget/goods_list_temp_page.dart';
import 'package:recook/pages/home/widget/home_countdown_widget.dart';
import 'package:recook/pages/home/widget/home_sliver_app_bar.dart';
import 'package:recook/pages/home/widget/home_weather_view.dart';
import 'package:recook/pages/live/live_stream/live_stream_view_page.dart';
import 'package:recook/pages/noticeList/notice_list_model.dart';
import 'package:recook/pages/noticeList/notice_list_tool.dart';
import 'package:recook/pages/tabBar/rui_code_listener.dart';
import 'package:recook/third_party/wechat/wechat_utils.dart';
import 'package:recook/utils/android_back_desktop.dart';
import 'package:recook/utils/app_router.dart';
import 'package:recook/utils/color_util.dart';
import 'package:recook/utils/custom_route.dart';
import 'package:recook/utils/permission_tool.dart';
import 'package:recook/utils/rui_code_util.dart';
import 'package:recook/utils/share_tool.dart';
import 'package:recook/widgets/alert.dart';
import 'package:recook/widgets/banner.dart';
import 'package:recook/widgets/custom_image_button.dart';
import 'package:recook/widgets/goods_item.dart';
import 'package:recook/widgets/home_gif_header.dart';
import 'package:recook/widgets/progress/re_toast.dart';
import 'package:recook/widgets/refresh_widget.dart';
import 'package:recook/widgets/toast.dart';
import 'package:recook/widgets/weather_page/weather_city_model.dart';
import 'package:recook/widgets/weather_page/weather_city_page.dart';
import 'package:recook/widgets/webView.dart';
import 'package:recook/pages/home/lottery_page.dart';
import 'package:sharesdk_plugin/sharesdk_plugin.dart';
import '../../utils/text_utils.dart';
class HomeItem {
String title;
String imagePath;
HomeItem(this.title, this.imagePath);
}
class HomeAcitvityItem {
String logoUrl;
String website;
HomeAcitvityItem(this.logoUrl, this.website);
}
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _HomePageState();
}
}
class ClipboardListenerValue {
static bool canListen = true;
}
class _HomePageState extends BaseStoreState<HomePage>
with TickerProviderStateMixin, WidgetsBindingObserver {
Map<String, Object> _weatherLocation;
TabController _tabController;
int _tabIndex = 0;
//控制额外功能显示(后端控制)
//false iOS隐藏
//true 全部显示
bool _displayExtraFunction = false;
List<BannerModel> _bannerList = [];
List<Promotion> _promotionList = [];
List _promotionGoodsList = [];
Map _activityMap;
GSRefreshController _gsRefreshController;
ScrollController _sliverListController;
// 天气数据
HomeWeatherModel _homeWeatherModel;
WeatherCityModel _weatherCityModel;
//高度
double screenWidth = 0;
double weatherHeight = 0;
double bannerHeight = 0;
double buttonsHeight = 100;
double t1Height = 0;
double t23Height = 0;
double t4Height = 0;
double timeHeight = 60;
double tabbarHeight = 48;
HomeCountdownController _homeCountdownController;
Color _backgroundColor;
StateSetter _bannerState;
GlobalKey<AnimatedHomeBackgroundState> _animatedBackgroundState = GlobalKey();
GlobalKey<HomeSliverAppBarState> _sliverAppBarGlobalKey = GlobalKey();
@override
bool needStore() {
return true;
}
Color getCurrentThemeColor() {
return getStore().state.themeData.appBarTheme.color;
}
Color getCurrentAppItemColor() {
return getStore().state.themeData.appBarTheme.iconTheme.color;
}
_openInstallGoodsIdListener() {
_handleOpenInstallEvents();
}
///监听剪切板
@override
void initState() {
super.initState();
requestPermission().then((value) {
if (value) {
AMapFlutterLocation().setLocationOption(AMapLocationOption());
AMapFlutterLocation().startLocation();
AMapFlutterLocation().onLocationChanged().listen((event) {
_weatherLocation = event;
});
}
});
// 分享注册
_mobShareInit();
// 判断微信是否登录
WeChatUtils.initial();
// meiqia注册
MQManager.initial();
ShareTool.init();
// _backgroundColor = AppColor.themeColor;
_homeCountdownController = HomeCountdownController();
UserManager.instance.openInstallGoodsId
.addListener(_openInstallGoodsIdListener);
UserManager.instance.openInstallLive.addListener(() {
if (getStore().state.openinstall.type == 'live') {
CRoute.push(
context,
LiveStreamViewPage(
id: int.parse(getStore().state.openinstall.itemId)));
}
if (!TextUtils.isEmpty(getStore().state.openinstall.type)) {
int goodsid = 0;
try {
goodsid = int.parse(getStore().state.openinstall.goodsid);
} catch (e) {
getStore().state.openinstall.goodsid = "";
return;
}
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments: CommodityDetailPage.setArguments(goodsid));
getStore().state.openinstall.goodsid = "";
}
});
_updateSource();
_sliverListController = ScrollController();
_gsRefreshController = GSRefreshController();
_tabController = TabController(length: _promotionList.length, vsync: this);
WidgetsBinding.instance.addPostFrameCallback((callback) {
if (getStore().state.goodsId != null && getStore().state.goodsId > 0) {
//跳到商品详情页面
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments:
CommodityDetailPage.setArguments(getStore().state.goodsId));
getStore().state.goodsId = 0;
}
_handleOpenInstallEvents();
// Alert.show(
// context,
// NormalTextDialog(
// type: NormalTextDialogType.delete,
// title: "提示",
// content: "同意隐私协议",
// items: ["确认"],
// listener: (index) {
// SharesdkPlugin.uploadPrivacyPermissionStatus(1, (bool success) {
// if(success == true) {
// showSuccess("隐私协议授权提交成功");
// } else {
// showError("隐私协议授权提交失败");
// }
// });
// },
// deleteItem: "取消",
// deleteListener: () {
// Alert.dismiss(context);
// },
// ));
});
WidgetsBinding.instance.addObserver(this);
// 抽奖功能
_userLottery();
_getNoticeList();
}
// 获取当前页面需要刷新的数据
_updateSource() {
_getWeather();
_getActiviteList();
_getBannerList();
_getPromotionList();
}
_handleOpenInstallEvents() {
if (!TextUtils.isEmpty(getStore().state.openinstall.goodsid)) {
int goodsid = 0;
try {
goodsid = int.parse(getStore().state.openinstall.goodsid);
} catch (e) {
getStore().state.openinstall.goodsid = "";
return;
}
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments: CommodityDetailPage.setArguments(goodsid));
getStore().state.openinstall.goodsid = "";
}
}
@override
void dispose() {
_tabController.dispose();
AMapFlutterLocation().stopLocation();
AMapFlutterLocation().destroy();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
bool _updateTag = false;
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.paused) _updateTag = true;
if (state == AppLifecycleState.resumed) {
//TODO 修复订单无法下单的问题,该问题只在华为设备中发生,
// Set native info: isAppForeground(true)
// Set native info: isAppForeground(false)
// 不停的在前后台切换,原因未知
if (_updateTag) {
_updateSource();
_updateTag = false;
}
// _handleOpenInstallEvents();
}
}
@override
Widget buildContext(BuildContext context, {store}) {
super.build(context);
screenWidth = MediaQuery.of(context).size.width;
weatherHeight = (76 + ScreenUtil.statusBarHeight);
bannerHeight = (screenWidth - 20) / 2.34;
t1Height = (screenWidth - 20) * 0.3429;
t23Height = ((screenWidth - 28) / 2) * 0.5 + 10;
t4Height = (screenWidth - 20) * 0.2714;
return WillPopScope(
onWillPop: () async {
Alert.show(
context,
NormalTextDialog(
type: NormalTextDialogType.normal,
title: "提示",
content: "是否要跳转到桌面?",
items: ["取消", "确认"],
listener: (index) {
switch (index) {
case 1:
AndroidBackTop.backDeskTop();
}
Alert.dismiss(context);
},
));
return false; //一定要return false
},
child: Scaffold(
body: Stack(
children: <Widget>[
Positioned(
left: 0,
right: 0,
top: 0,
bottom: 0,
child: Container(
// color: _backgroundColor,
),
),
Positioned(
left: 0,
right: 0,
top: 0,
bottom: 0,
child: RefreshWidget(
header: HomeGifHeader(),
isInNest: true,
headerTriggerDistance: ScreenUtil.statusBarHeight,
color: Colors.black,
controller: _gsRefreshController,
onRefresh: () async {
_tabController.animateTo(_tabIndex);
_updateSource();
},
body: _buildBody(context),
),
)
],
)));
}
_actionsWidget() {
GestureDetector scanCon = GestureDetector(
onTap: () async {
if (Platform.isIOS) {
AppRouter.push(context, RouteName.BARCODE_SCAN);
return;
}
bool canUseCamera = await PermissionTool.haveCameraPermission();
bool canUsePhoto = await PermissionTool.havePhotoPermission();
if (!canUseCamera) {
PermissionTool.showOpenPermissionDialog(context, "没有相机权限,请先授予相机权限");
return;
} else if (!canUsePhoto) {
PermissionTool.showOpenPermissionDialog(context, "没有照片权限,请先授予照片权限");
return;
} else {
AppRouter.push(context, RouteName.BARCODE_SCAN);
}
},
child: Container(
color: Colors.black.withAlpha(1),
height: kToolbarHeight,
child: Column(
children: <Widget>[
Container(
width: 40,
height: 40,
alignment: Alignment.center,
child: Image.asset(
"assets/navigation_scan.png",
fit: BoxFit.cover,
width: 20,
height: 20,
),
),
Spacer(),
],
),
));
return <Widget>[
Container(
height: kToolbarHeight,
child: Column(
children: <Widget>[
CustomImageButton(
buttonSize: 40,
padding: EdgeInsets.all(0),
icon: ImageIcon(AssetImage("assets/navigation_msg.png")),
color: getCurrentAppItemColor(),
onPressed: () {
if (UserManager.instance.haveLogin) {
MQManager.goToChat(
userId: UserManager.instance.user.info.id.toString(),
userInfo: <String, String>{
"name": UserManager.instance.user.info.nickname ?? "",
"gender": UserManager.instance.user.info.gender == 1
? ""
: "",
"mobile": UserManager.instance.user.info.mobile ?? ""
});
} else {
AppRouter.pushAndRemoveUntil(context, RouteName.LOGIN);
// showError("请先登录!");
Toast.showError("请先登录");
}
},
),
Spacer(),
],
),
),
scanCon,
Container(
width: 10,
),
];
}
Widget _buildTitle() {
double iconSize = 18;
GestureDetector ges = GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 5, bottom: 5),
// height: rSize(30),
height: 30,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.4),
borderRadius: BorderRadius.circular(20)),
child: Row(
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 10),
width: ScreenAdapterUtils.setWidth(iconSize),
height: ScreenAdapterUtils.setWidth(iconSize),
child: Image.asset(
'assets/home_tab_search.png',
width: ScreenAdapterUtils.setWidth(iconSize),
height: ScreenAdapterUtils.setWidth(iconSize),
),
),
Container(
width: 6,
),
Text(
"厨房小工具",
style: TextStyle(
color: Colors.white.withOpacity(0.9),
fontSize: ScreenAdapterUtils.setSp(13),
fontWeight: FontWeight.w300),
)
],
),
),
onTap: () {
AppRouter.push(context, RouteName.SEARCH);
},
);
String locationCityName =
_weatherLocation != null && !TextUtils.isEmpty(_weatherLocation['city'])
? _weatherLocation['city']
: "";
try {
locationCityName = locationCityName.replaceAll("", "");
locationCityName = locationCityName.replaceAll("", "");
} catch (e) {}
String cityName =
_homeWeatherModel != null && !TextUtils.isEmpty(_homeWeatherModel.city)
? _homeWeatherModel.city.length > 6
? _homeWeatherModel.city.substring(0, 6)
: _homeWeatherModel.city
: "";
Widget leftContainer = GestureDetector(
onTap: () {
AppRouter.push(context, RouteName.WEATHER_CITY_PAGE,
arguments: WeatherCityPage.setArguments(locationCityName))
.then((model) {
if (model is WeatherCityModel) {
_weatherCityModel = model;
_getWeather();
}
});
},
child: Container(
child: Row(
children: <Widget>[
Icon(
Icons.place,
color: Colors.white,
size: 17,
),
Container(
width: 2,
),
Text(
cityName,
overflow: TextOverflow.fade,
maxLines: 1,
style: TextStyle(
color: Colors.white,
fontSize: 18,
),
),
Container(
width: 5,
),
],
),
),
);
return Container(
height: kToolbarHeight,
// child: ges,
child: Column(
children: <Widget>[
Container(
height: 40,
child: Flex(
direction: Axis.horizontal,
children: <Widget>[
leftContainer,
Expanded(
child: ges,
)
],
),
// child: ges,
),
// Spacer()
],
),
);
}
Widget _buildBody(BuildContext context) {
return CustomScrollView(
controller: _sliverListController,
slivers: <Widget>[
HomeSliverAppBar(
key: _sliverAppBarGlobalKey,
actions: _actionsWidget(),
title: _buildTitle(),
backgroundColor: AppColor.themeColor,
expandedHeight: _promotionList == null || _promotionList.length == 0
? weatherHeight +
bannerHeight +
buttonsHeight +
t1Height +
t23Height +
t4Height +
rSize(62) +
timeHeight +
tabbarHeight -
ScreenUtil.statusBarHeight -
tabbarHeight +
4
: weatherHeight +
bannerHeight +
buttonsHeight +
t1Height +
t23Height +
t4Height +
rSize(62) +
timeHeight +
tabbarHeight -
ScreenUtil.statusBarHeight +
4,
flexibleSpace: _flexibleSpaceBar(context),
bottom: _promotionList == null || _promotionList.length == 0
? PreferredSize(
child: Container(), preferredSize: Size.fromHeight(1))
// : PreferredSize(preferredSize: Size.fromHeight(40),
: PreferredSize(
preferredSize: Size.fromHeight(tabbarHeight),
child: Container(
alignment: Alignment.center,
color: AppColor.frenchColor,
child: HomePageTabbar(
promotionList: _promotionList,
timerJump: (index) {
_tabIndex = index;
_homeCountdownController.indexChange(index);
// 定时任务回调
_tabController.animateTo(index);
_getPromotionGoodsList(_promotionList[index].id);
},
clickItem: (index) {
_homeCountdownController.indexChange(index);
_getPromotionGoodsList(_promotionList[index].id);
},
tabController: _tabController,
),
),
)),
SliverList(
delegate: SliverChildListDelegate(
List.generate(
_promotionList == null || _promotionList.length == 0
? 0
: _promotionGoodsList.length + 1, (index) {
if (index == _promotionGoodsList.length) {
return Container(
color: AppColor.frenchColor,
alignment: Alignment.center,
height: 60,
child: Text(
'已经到底啦~',
style: TextStyle(
color: Colors.black.withOpacity(0.4),
fontSize: ScreenAdapterUtils.setSp(13)),
),
);
}
if (_promotionGoodsList[index] is PromotionGoodsModel) {
PromotionGoodsModel model = _promotionGoodsList[index];
return Container(
padding: EdgeInsets.only(bottom: 5),
color: AppColor.frenchColor,
child: GoodsItemWidget.rowGoods(
isSingleDayGoods: false,
onBrandClick: () {
AppRouter.push(context, RouteName.BRANDGOODS_LIST_PAGE,
arguments: BrandGoodsListPage.setArguments(
model.brandId, model.brandName));
},
model: model,
shareClick: () {
String goodsTitle =
"${model.priceDesc} | ${model.goodsName} | ${model.description}";
ShareTool().goodsShare(context,
goodsPrice: model.price.toStringAsFixed(2),
goodsName: model.goodsName,
goodsDescription: model.description,
miniTitle: goodsTitle,
miniPicurl: model.picture.url,
amount: model.commission.toString(),
goodsId: model.goodsId.toString());
},
buyClick: () {
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments:
CommodityDetailPage.setArguments(model.goodsId));
},
),
);
} else if (_promotionGoodsList[index] is PromotionActivityModel) {
PromotionActivityModel activityModel =
_promotionGoodsList[index];
return RowActivityItem(
model: activityModel,
click: () {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: activityModel.activityUrl,
title: "活动",
hideBar: true),
);
},
);
} else {
return Container();
}
}),
),
),
],
);
}
FlexibleSpaceBar _flexibleSpaceBar(context) {
return FlexibleSpaceBar(
collapseMode: CollapseMode.pin,
background: Container(
//头部整个背景颜色
height: double.infinity,
color: AppColor.frenchColor,
// color: Colors.white,
child: Stack(
children: <Widget>[
AnimatedHomeBackground(
key: _animatedBackgroundState,
height: weatherHeight + bannerHeight - 32,
backgroundColor:
_backgroundColor == null ? Colors.white : _backgroundColor,
),
Column(
children: <Widget>[
HomeWeatherWidget(
backgroundColor: Colors.white.withAlpha(0),
homeWeatherModel: _homeWeatherModel,
),
_bannerView(),
_buildGoodsCards(),
_buttonTitle(context),
_activityImageTitle(),
_activityImageRow(),
_activityT4Image(),
HomeCountdownWidget(
height: timeHeight,
controller: _homeCountdownController,
promotionList: _promotionList,
),
],
),
],
)),
);
}
_bannerView() {
if (_backgroundColor == null &&
_bannerList != null &&
_bannerList.length > 0) {
BannerModel bannerModel = _bannerList[0];
if (!TextUtils.isEmpty(bannerModel.color)) {
Color color = ColorsUtil.hexToColor(bannerModel.color);
_backgroundColor = color;
_animatedBackgroundState.currentState.changeColor(color);
_sliverAppBarGlobalKey.currentState.updateColor(color);
}
}
Widget banner =
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
_bannerState = setState;
if (_bannerList == null || _bannerList.length == 0) {
return Container(
height: bannerHeight,
);
}
BannerListView bannerListView = BannerListView<BannerModel>(
onPageChanged: (index) {
int realIndex = index - 1;
if (realIndex < 0) return;
if (realIndex >= _bannerList.length) realIndex = 0;
BannerModel bannerModel = _bannerList[realIndex];
if (!TextUtils.isEmpty(bannerModel.color)) {
Color color = ColorsUtil.hexToColor(bannerModel.color);
_backgroundColor = color;
_animatedBackgroundState.currentState.changeColor(color);
_sliverAppBarGlobalKey.currentState.updateColor(color);
}
},
height: bannerHeight,
margin: EdgeInsets.symmetric(horizontal: 10),
radius: 10,
data: _bannerList,
builder: (context, bannerModel) {
return GestureDetector(
onTap: () {
if (!TextUtils.isEmpty(
(bannerModel as BannerModel).activityUrl)) {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: (bannerModel as BannerModel).activityUrl,
title: "活动",
hideBar: true),
);
} else {
AppRouter.push(context, RouteName.COMMODITY_PAGE,
arguments: CommodityDetailPage.setArguments(
(bannerModel as BannerModel).goodsId));
}
},
child: ExtendedImage.network(Api.getImgUrl(bannerModel.url),
fit: BoxFit.fill, enableLoadState: false),
);
},
);
return bannerListView;
});
return Container(
width: screenWidth,
height: bannerHeight,
color: Colors.white.withAlpha(0),
child: Stack(
children: <Widget>[
Positioned(
left: 0,
right: 0,
bottom: 0,
top: 0,
child: _bannerList == null ? Container() : banner,
)
],
),
);
}
_activityImageTitle() {
HomeAcitvityItem item;
if (_activityMap != null && _activityMap.containsKey('a')) {
item = _activityMap['a'];
}
return GestureDetector(
onTap: () {
if (item != null && !TextUtils.isEmpty(item.website)) {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: item.website, title: "活动", hideBar: true),
);
}
},
child: Container(
color: AppColor.frenchColor,
padding: EdgeInsets.only(
left: 10,
right: 10,
),
child: ClipRRect(
child: _activityMap != null && _activityMap.containsKey('a')
? ExtendedImage.network(
Api.getImgUrl(item.logoUrl),
fit: BoxFit.fill,
enableLoadState: false,
)
// CustomCacheImage(imageUrl: Api.getImgUrl(item.logoUrl),fit: BoxFit.fill, height: rSize(300),width: MediaQuery.of(context).size.width,)
: Container(),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
height: t1Height,
width: screenWidth,
),
);
}
_activityT4Image() {
HomeAcitvityItem itemD;
if (_activityMap != null && _activityMap.containsKey('d')) {
itemD = _activityMap['d'];
}
Container con = Container(
width: screenWidth,
height: t4Height,
color: AppColor.frenchColor,
padding: EdgeInsets.symmetric(horizontal: 10),
child: ClipRRect(
child: _activityMap != null && _activityMap.containsKey('d')
? ExtendedImage.network(
Api.getImgUrl(itemD.logoUrl),
fit: BoxFit.fill,
enableLoadState: false,
)
: Container(),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
);
return GestureDetector(
onTap: () {
if (itemD != null && !TextUtils.isEmpty(itemD.website)) {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: itemD.website, title: "活动", hideBar: true),
);
}
},
child: con,
);
}
_activityImageRow() {
HomeAcitvityItem itemB, itemC;
if (_activityMap != null && _activityMap.containsKey('b')) {
itemB = _activityMap['b'];
}
if (_activityMap != null && _activityMap.containsKey('c')) {
itemC = _activityMap['c'];
}
return Container(
color: AppColor.frenchColor,
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
height: t23Height,
width: screenWidth,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: GestureDetector(
onTap: () {
if (itemB != null && !TextUtils.isEmpty(itemB.website)) {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: itemB.website, title: "活动", hideBar: true),
);
}
},
child: Container(
child: ClipRRect(
child: _activityMap != null &&
_activityMap.containsKey('b')
? ExtendedImage.network(
Api.getImgUrl(itemB.logoUrl),
fit: BoxFit.fill,
enableLoadState: false)
// CustomCacheImage(imageUrl: Api.getImgUrl(itemB.logoUrl),fit: BoxFit.fill,)
: Container(),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5),
),
),
height: t23Height,
// width: MediaQuery.of(context).size.width,
),
),
),
Container(
width: 8,
),
Expanded(
child: GestureDetector(
onTap: () {
if (itemC != null && !TextUtils.isEmpty(itemC.website)) {
AppRouter.push(
context,
RouteName.WEB_VIEW_PAGE,
arguments: WebViewPage.setArguments(
url: itemC.website, title: "活动", hideBar: true),
);
}
},
child: Container(
child: ClipRRect(
child: _activityMap != null &&
_activityMap.containsKey('c')
? ExtendedImage.network(
Api.getImgUrl(itemC.logoUrl),
fit: BoxFit.fill,
enableLoadState: false)
// CustomCacheImage(imageUrl: Api.getImgUrl(itemC.logoUrl),fit: BoxFit.fill,)
: Container(),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5),
),
),
height: t23Height,
// width: MediaQuery.of(context).size.width,
),
),
),
],
),
),
],
),
);
}
_buttonTitle(context) {
Container titles = Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_buttonTitleRow(
AppConfig.getShowCommission()
? R.ASSETS_HOME_MENU_A_PNG
: R.ASSETS_LISTTEMP_RECOOKMAKE_ICON_PNG,
AppConfig.getShowCommission() ? "我的权益" : "瑞库制品",
onPressed: () {
if (AppConfig.getShowCommission()) {
if (!UserManager.instance.haveLogin) {
AppRouter.pushAndRemoveUntil(context, RouteName.LOGIN);
return;
}
AppRouter.push(
globalContext,
RouteName.SHOP_PAGE_USER_RIGHTS_PAGE,
);
} else {
AppRouter.push(context, RouteName.GOODS_LIST_TEMP,
arguments: GoodsListTempPage.setArguments(
title: "瑞库制品", type: GoodsListTempType.recookMake));
// AppRouter.pushAndRemoveUntil(context, RouteName.LOGIN);
}
// return;
// AppRouter.push(context, RouteName.NEW_USER_DISCOUNT_PAGE);
}),
_buttonTitleRow(
// R.ASSETS_LOTTERY_REDEEM_LOTTERY_ICON_PNG,
AppConfig.getShowCommission()
? R.ASSETS_HOME_MENU_BB_PNG
: R.ASSETS_LISTTEMP_HOMELIFE_ICON_PNG,
// AppConfig.getShowCommission() ? "我的店铺" : "家居生活",
// '彩票兑换',
'彩票频道',
onPressed: () {
AppRouter.push(context, RouteName.REDEEM_LOTTERY_PAGE);
},
// () {
// if (AppConfig.getShowCommission()) {
// bool value = UserManager.instance.selectTabbar.value;
// UserManager.instance.selectTabbar.value = !value;
// UserManager.instance.selectTabbarIndex = 1;
// } else {
// AppRouter.push(context, RouteName.GOODS_LIST_TEMP,
// arguments: GoodsListTempPage.setArguments(
// title: "家居生活", type: GoodsListTempType.homeLife));
// }
// },
),
_buttonTitleRow(
AppConfig.getShowCommission()
? R.ASSETS_HOME_INVITE_WEBP_S_PNG
: R.ASSETS_LISTTEMP_HOMEAPPLIANCES_ICON_PNG,
AppConfig.getShowCommission()
// ? "升级店主"
? "一键邀请"
: "数码家电", onPressed: () {
if (AppConfig.getShowCommission()) {
ShareTool().inviteShare(context, customTitle: Container());
} else {
AppRouter.push(context, RouteName.GOODS_LIST_TEMP,
arguments: GoodsListTempPage.setArguments(
title: "数码家电",
type: GoodsListTempType.homeAppliances));
// AppRouter.push(context, RouteName.Member_BENEFITS_PAGE,);
}
}),
_buttonTitleRow(R.ASSETS_HOME_MENU_DD_PNG, "热销榜单",
onPressed: () {
AppRouter.push(context, RouteName.GOODS_HOT_LIST);
}),
_buttonTitleRow(R.ASSETS_HOME_MENU_EE_PNG, "全部分类",
onPressed: () {
HomeDao.getCategories(success: (data, code, msg) {
CRoute.push(
context,
ClassifyPage(
data: data,
));
}, failure: (code, msg) {
Toast.showError(msg);
});
}),
],
),
),
],
),
);
return Container(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 3),
color: AppColor.frenchColor,
height: 100,
width: MediaQuery.of(context).size.width,
child: titles,
);
}
_buttonTitleRow(icon, title, {onPressed}) {
return Expanded(
child: CupertinoButton(
padding: EdgeInsets.zero,
child: Column(
children: <Widget>[
Container(
height: 10,
),
Container(
margin: EdgeInsets.only(top: 5),
width: 48,
height: 48,
child: Image.asset(
icon,
fit: BoxFit.fill,
),
),
Container(
margin: EdgeInsets.only(top: 8),
child: Text(
title,
style: TextStyle(
fontWeight: FontWeight.w400,
fontSize: ScreenAdapterUtils.setSp(12),
color: Colors.black.withOpacity(0.8)),
),
)
],
),
onPressed: () {
if (onPressed != null) {
onPressed();
}
},
),
);
}
///首页上方分类功能卡片
_buildGoodsCards() {
return SizedBox(
width: MediaQuery.of(context).size.width,
height: rSize(62),
child: Row(
children: [
Expanded(
child: ListView(
padding: EdgeInsets.only(left: rSize(10)),
scrollDirection: Axis.horizontal,
children: [
_buildSingleGoodsCard(R.ASSETS_HOME_IC_DEPARTMENT_PNG, '日用百货'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_WINE_PNG, '酒饮冲调'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_IMPORT_PNG, '进口专区'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_TEA_PNG, '休闲美食'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_FOOD_PNG, '有机食品'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_VEGETABLES_PNG, '蔬果生鲜'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_RICE_PNG, '柴米油盐'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_ELECTRICITY_PNG, '家用电器'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_PHONE_PNG, '手机数码'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_BABY_PNG, '母婴用品'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_SPORT_PNG, '运动旅行'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_MEDICALBOX_PNG, '医疗保健'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_HAIR_PNG, '美妆护肤'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_CLEAN_PNG, '个护清洁'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_BOOK_PNG, '图文教育'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_FURNITURE_PNG, '家具饰品'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_CLOTHES_PNG, '服饰内衣'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_BAG_PNG, '鞋靴箱包'),
_buildSingleGoodsCard(R.ASSETS_HOME_IC_MEMBERS_PNG, '会员专享'),
],
),
),
Container(
height: rSize(62),
decoration: BoxDecoration(
color: AppColor.frenchColor,
boxShadow: [
//使用多层阴影的方式实现单边boxShadow
/// more at [stackoverflow](https://stackoverflow.com/a/65296931/7963151)
BoxShadow(
color: Colors.black12,
blurRadius: 10,
offset: Offset(-5, 0),
),
// BoxShadow(color: AppColor.frenchColor, offset: Offset(0, -16)),
BoxShadow(color: AppColor.frenchColor, offset: Offset(0, 16)),
BoxShadow(color: AppColor.frenchColor, offset: Offset(16, 0)),
],
),
child: _buildSingleGoodsCard(
R.ASSETS_HOME_IC_CLASSIFICATION_PNG, '分类'),
),
],
),
);
}
Widget _buildSingleGoodsCard(String path, String name) {
return MaterialButton(
minWidth: rSize(54),
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onPressed: () async {
final loadingCancel = ReToast.loading();
await HomeDao.getCategories(success: (data, code, msg) {
loadingCancel();
CRoute.push(
context,
ClassifyPage(
data: data,
initValue: name,
));
}, failure: (code, msg) {
Toast.showError(msg);
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
path,
height: rSize(28),
width: rSize(28),
),
Text(
name,
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSize(10),
),
),
],
),
);
}
@override
bool get wantKeepAlive => true;
_getBannerList() async {
ResultData resultData = await HttpManager.post(HomeApi.banner_list, {});
if (!resultData.result) {
showError(resultData.msg);
return;
}
BannerListModel model = BannerListModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
showError(model.msg);
return;
}
_bannerState(() {
_bannerList = model.data;
});
}
_getActiviteList() async {
ResultData resultData = await HttpManager.post(HomeApi.activity_list, {});
if (!resultData.result) {
showError(resultData.msg);
return;
}
BaseModel model = BaseModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
showError(model.msg);
return;
}
if (resultData.data['data'] != null) {
setState(() {
HashMap map = HashMap.from(resultData.data['data']);
Map itemMap = {};
itemMap.addAll(
{'a': HomeAcitvityItem(map['a']['logoUrl'], map['a']['website'])});
itemMap.addAll(
{'b': HomeAcitvityItem(map['b']['logoUrl'], map['b']['website'])});
itemMap.addAll(
{'c': HomeAcitvityItem(map['c']['logoUrl'], map['c']['website'])});
itemMap.addAll(
{'d': HomeAcitvityItem(map['d']['logoUrl'], map['d']['website'])});
_activityMap = itemMap;
});
}
}
_getPromotionList() async {
RUICodeListener(context).clipboardListener();
ResultData resultData = await HttpManager.post(HomeApi.promotion_list, {});
if (_gsRefreshController.isRefresh()) {
// Future.delayed(Duration(milliseconds: 1500), () {
_gsRefreshController.refreshCompleted();
_gsRefreshController.loadNoData();
// });
}
if (!resultData.result) {
showError(resultData.msg);
return;
}
PromotionListModel model = PromotionListModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
showError(model.msg);
return;
}
_promotionList = model.data;
if (_promotionList == null || _promotionList.length == 0) {
_promotionGoodsList = [];
setState(() {});
return;
}
int _index = 0;
for (Promotion item in _promotionList) {
PromotionStatus processStatus = PromotionTimeTool.getPromotionStatus(
item.startTime, item.getTrueEndTime());
// DateTime time = DateTime.parse("2020-03-18 23:00:00");
DateTime time = DateTime.now();
if (time.hour >= 22 &&
DateTime.parse(item.startTime).hour == 20 &&
time.day == DateTime.parse(item.startTime).day) {
//10点以后定位到8点
_index = _promotionList.indexOf(item);
} else if (processStatus == PromotionStatus.start) {
_index = _promotionList.indexOf(item);
}
}
_homeCountdownController.indexChange(_index);
_tabController = TabController(
vsync: this, length: _promotionList.length, initialIndex: _index);
_tabIndex = _index;
_getPromotionGoodsList(_promotionList[_index].id);
}
_getPromotionGoodsList(int promotionId) async {
ResultData resultData =
await HttpManager.post(HomeApi.promotion_goods_list, {
"timeItemID": promotionId,
});
if (!resultData.result) {
showError(resultData.msg);
return;
}
PromotionGoodsListModel model =
PromotionGoodsListModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
showError(model.msg);
return;
}
List array = [];
if (model.data.goodsList == null) {
model.data.goodsList = [];
} else {
array.addAll(model.data.goodsList);
}
if (model.data.activityList != null && model.data.activityList.length > 0) {
if (array.length > 3) {
array.insert(3, model.data.activityList.first);
} else {
array.add(model.data.activityList.first);
}
}
// _promotionGoodsList = model.data.goodsList;
_promotionGoodsList = array;
if (mounted) {
setState(() {
double height = weatherHeight +
bannerHeight +
buttonsHeight +
t1Height +
t23Height +
t4Height +
timeHeight +
tabbarHeight -
ScreenUtil.statusBarHeight -
tabbarHeight -
kToolbarHeight;
double offset = _sliverListController.offset;
if (offset > height) {
_sliverListController.animateTo(height,
duration: Duration(milliseconds: 300), curve: Curves.linear);
}
});
}
}
_getWeather() async {
// if (_weatherLocation==null)
String url =
"https://tianqiapi.com/api?version=v61&appid=81622428&appsecret=AxKzYWq3";
if (_weatherCityModel != null && !TextUtils.isEmpty(_weatherCityModel.id)) {
url = "$url&cityid=${_weatherCityModel.id}";
} else if (_weatherCityModel != null &&
!TextUtils.isEmpty(_weatherCityModel.cityZh)) {
url = "$url&city=${_weatherCityModel.cityZh}";
} else if (_weatherLocation != null &&
!TextUtils.isEmpty(_weatherLocation['city'])) {
// url = "$url&point=gaode&lng=${_weatherLocation.latLng.longitude.toString()}&lat=${_weatherLocation.latLng.latitude.toString()}";
String city = (_weatherLocation['city'] as String).replaceAll("", "");
city = city.replaceAll("", "");
url = "$url&city=$city";
}
Response res = await HttpManager.netFetchNormal(url, null, null, null);
if (res == null) {
return;
}
Map map = json.decode(res.toString());
_homeWeatherModel = HomeWeatherModel.fromJson(map);
UserManager.instance.homeWeatherModel = _homeWeatherModel;
if (mounted) setState(() {});
}
_mobShareInit() {
ShareSDKRegister register = ShareSDKRegister();
register.setupSinaWeibo(
"3484799074", "0cc08d31b4d63dc81fbb7a2559999fb3", "https://reecook.cn");
register.setupQQ("101876843", "6f367bfad98978e22c2e11897dd74f00");
SharesdkPlugin.regist(register);
}
Future<bool> requestPermission() async {
final permissions = await PermissionHandler()
.requestPermissions([PermissionGroup.location]);
if (permissions[PermissionGroup.location] == PermissionStatus.granted) {
return true;
} else {
return false;
}
}
_userLottery() {
//抽奖功能
HttpManager.post(
UserApi.user_lottery,
{'userID': UserManager.instance.user.info.id},
).then((value) {
if (value.data != null) {
Map map = value.data;
if (!map.containsKey("data")) return;
if (value.data['data']['result'] == 0) {
HttpManager.post(UserApi.user_do_lottery,
{'userID': UserManager.instance.user.info.id}).then((result) {
Future.delayed(Duration(milliseconds: 500), () {
Navigator.push(
context,
PageRouteBuilder(
opaque: false,
pageBuilder: (BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation) {
return LotteryPage(
cardIndex: result.data['data']['result'],
);
}),
);
});
});
}
}
});
}
_getNoticeList() async {
// // await NoticeListTool.diamondRecommendation(context, title: "您成功推荐了X位大咖,恭喜获得X张晋升卡和保障卡");
// // await NoticeListTool.vipAlert(context);
// await NoticeListTool.perfectInformation(context, getStore());
// // await NoticeListTool.inputExpressInformation(context);
// return;
if (!UserManager.instance.haveLogin) return;
ResultData resultData = await HttpManager.post(
HomeApi.notice_list, {"uid": UserManager.instance.user.info.id});
if (resultData.data == null) return;
NoticeListModel noticeListModel = NoticeListModel.fromJson(resultData.data);
if (noticeListModel.data != null && noticeListModel.data.length > 0) {
for (NoticeData noticeData in noticeListModel.data) {
// 1钻石推荐的提示,2 23层会员登录的提示3首次改昵称4需要填写快递的提示
if (noticeData.type == 1)
await NoticeListTool.diamondRecommendation(context,
title: noticeData.content);
if (noticeData.type == 2 && (AppConfig.getShowCommission()))
//await NoticeListTool.vipAlert(context);
if (noticeData.type == 3)
await NoticeListTool.perfectInformation(context, getStore());
if (noticeData.type == 4)
await NoticeListTool.inputExpressInformation(context);
}
}
}
}