Browse Source

1.优化热榜加载数据

2。优化商品详情图片预览动画
tags/0.0.2+7^2
杨华轩 4 years ago
parent
commit
eb1c0302b5
6 changed files with 165 additions and 59 deletions
  1. +10
    -2
      lib/pages/hot_ranking_page/hot_ranking_page.dart
  2. +13
    -12
      lib/widgets/goods_details/detail_img/goods_details_img.dart
  3. +7
    -3
      lib/widgets/goods_details/slide_banner/goods_details_slide_banner_widget.dart
  4. +119
    -35
      lib/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart
  5. +5
    -0
      lib/widgets/hot_ranking/hot_ranking_list/hot_ranking_bloc.dart
  6. +11
    -7
      lib/widgets/hot_ranking/hot_ranking_list/hot_ranking_list.dart

+ 10
- 2
lib/pages/hot_ranking_page/hot_ranking_page.dart View File

@@ -22,7 +22,7 @@ class HotRankingPage extends StatefulWidget {
_HotRankingPageState createState() => _HotRankingPageState(); _HotRankingPageState createState() => _HotRankingPageState();
} }


class _HotRankingPageState extends State<HotRankingPage> {
class _HotRankingPageState extends State<HotRankingPage> with AutomaticKeepAliveClientMixin{
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print('hot_ranking_page build'); print('hot_ranking_page build');
@@ -48,6 +48,10 @@ class _HotRankingPageState extends State<HotRankingPage> {
), ),
); );
} }

@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
} }


class _HotRankingPageContainer extends StatefulWidget { class _HotRankingPageContainer extends StatefulWidget {
@@ -60,7 +64,7 @@ class _HotRankingPageContainer extends StatefulWidget {
__HotRankingPageContainerState(); __HotRankingPageContainerState();
} }


class __HotRankingPageContainerState extends State<_HotRankingPageContainer> {
class __HotRankingPageContainerState extends State<_HotRankingPageContainer> with AutomaticKeepAliveClientMixin{
HotRankingPageBloc _bloc; HotRankingPageBloc _bloc;
RefreshController _refreshController; RefreshController _refreshController;
String backgroundImage; String backgroundImage;
@@ -136,6 +140,10 @@ class __HotRankingPageContainerState extends State<_HotRankingPageContainer> {
} }
return list; return list;
} }

@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
} }


class _SilverAppBarDelegate extends SliverPersistentHeaderDelegate { class _SilverAppBarDelegate extends SliverPersistentHeaderDelegate {


+ 13
- 12
lib/widgets/goods_details/detail_img/goods_details_img.dart View File

@@ -97,18 +97,19 @@ class _GoodsDetailsImgWidgetContainerState
return Column( return Column(
children: model.image_detail_list.map((item) { children: model.image_detail_list.map((item) {
return GestureDetector( return GestureDetector(
onTap: () {
if(item!=null){
PhotoPreview.showPhotoPreviewByimages(
context, [item],
currentIndex: 0);
}
},
child: CachedNetworkImage(
imageUrl: item ?? '',
fit: BoxFit.fitWidth,
),
);
onTap: () {
if (item != null) {
PhotoPreview.showPhotoPreviewByimages(context, [item],
currentIndex: 0, heroTagSuffix: "bottom");
}
},
child: Hero(
tag: item + "bottom",
child: CachedNetworkImage(
imageUrl: item ?? '',
fit: BoxFit.fitWidth,
),
));
}).toList(), }).toList(),
); );
} else { } else {


+ 7
- 3
lib/widgets/goods_details/slide_banner/goods_details_slide_banner_widget.dart View File

@@ -46,8 +46,9 @@ class _GoodsDetailsSlideBannerContainerState
/// 子元素点击事件 /// 子元素点击事件
void _itemOnClick(String model, List<String> images, int index) { void _itemOnClick(String model, List<String> images, int index) {
print('点击了 $model'); print('点击了 $model');
if(images!=null){
PhotoPreview.showPhotoPreviewByimages(context, images, currentIndex: index);
if (images != null) {
PhotoPreview.showPhotoPreviewByimages(context, images,
currentIndex: index, heroTagSuffix: "top");
} }
} }


@@ -108,7 +109,10 @@ class _GoodsDetailsSlideBannerContainerState
String items = datas.image_list[index]; String items = datas.image_list[index];
return Container( return Container(
width: double.infinity, width: double.infinity,
child: CachedNetworkImage(imageUrl: items ?? '', fit: BoxFit.cover),
child: Hero(
tag: items + "top",
child: CachedNetworkImage(
imageUrl: items ?? '', fit: BoxFit.cover)),
); );
}, },
itemCount: datas?.image_list?.length ?? 0, itemCount: datas?.image_list?.length ?? 0,


+ 119
- 35
lib/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart View File

@@ -12,25 +12,31 @@ class HotRankingGoods extends StatelessWidget {
HotRankingListModel styleModel; HotRankingListModel styleModel;
int index; int index;


HotRankingGoods({Key key, this.good, this.styleModel, this.index}) : super(key: key);
HotRankingGoods({Key key, this.good, this.styleModel, this.index})
: super(key: key);


@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var indexImage; var indexImage;
if (styleModel.hotRankIconList != null && styleModel.hotRankIconList.length > 0 && styleModel.hotRankIconList.length - 1 >= index) {
if (styleModel.hotRankIconList != null &&
styleModel.hotRankIconList.length > 0 &&
styleModel.hotRankIconList.length - 1 >= index) {
indexImage = styleModel.hotRankIconList[index]; indexImage = styleModel.hotRankIconList[index];
} }
Providers providers = getProvider(good.provider); Providers providers = getProvider(good.provider);
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
RouterUtil.route(SkipModel(skipIdentifier: "goods_details"), good?.toJson(), context);
RouterUtil.route(SkipModel(skipIdentifier: "goods_details"),
good?.toJson(), context);
}, },
child: Stack( child: Stack(
children: <Widget>[ children: <Widget>[
Container( Container(
padding: EdgeInsets.all(15.w), padding: EdgeInsets.all(15.w),
margin: EdgeInsets.only(top: 8.w, bottom: 8.w, left: 25.w, right: 25.w),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15.w)),
margin:
EdgeInsets.only(top: 8.w, bottom: 8.w, left: 25.w, right: 25.w),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(15.w)),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
@@ -40,11 +46,15 @@ class HotRankingGoods extends StatelessWidget {
height: 254.w, height: 254.w,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(6),
child: CachedNetworkImage(
imageUrl: good?.goodImage ?? '',
child: Hero(
tag: (good?.goodImage ?? "") + "top",
child: CachedNetworkImage(
imageUrl: good?.goodImage ?? '',
),
), ),
), ),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6)),
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(6)),
), ),


/// 商品图片右边视图 /// 商品图片右边视图
@@ -64,8 +74,12 @@ class HotRankingGoods extends StatelessWidget {
WidgetSpan( WidgetSpan(
alignment: ui.PlaceholderAlignment.middle, alignment: ui.PlaceholderAlignment.middle,
child: Container( child: Container(
padding: EdgeInsets.only(left: 4.w, right: 4.w, top: 1, bottom: 1),
decoration: BoxDecoration(color: HexColor.fromHex(providers.providerBgColor), borderRadius: BorderRadius.circular(2.5)),
padding: EdgeInsets.only(
left: 4.w, right: 4.w, top: 1, bottom: 1),
decoration: BoxDecoration(
color: HexColor.fromHex(
providers.providerBgColor),
borderRadius: BorderRadius.circular(2.5)),
child: Text( child: Text(
good.providerName ?? "", good.providerName ?? "",
style: TextStyle( style: TextStyle(
@@ -79,7 +93,12 @@ class HotRankingGoods extends StatelessWidget {
child: SizedBox( child: SizedBox(
width: 4.h, width: 4.h,
)), )),
TextSpan(text: good.goodTitle, style: TextStyle(color: HexColor.fromHex(styleModel.titleColor ?? ""), fontSize: 30.sp))
TextSpan(
text: good.goodTitle,
style: TextStyle(
color: HexColor.fromHex(
styleModel.titleColor ?? ""),
fontSize: 30.sp))
])), ])),


/// 优惠券 /// 优惠券
@@ -88,16 +107,32 @@ class HotRankingGoods extends StatelessWidget {
good.coupon == "" good.coupon == ""
? Container() ? Container()
: Container( : Container(
margin: EdgeInsets.only(top: 4, bottom: 4, right: 15.w),
margin: EdgeInsets.only(
top: 4, bottom: 4, right: 15.w),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2.5),
color: HexColor.fromHex(styleModel.couponCommission.left.couponBgColor),
image: DecorationImage(image: CachedNetworkImageProvider(styleModel.couponCommission.left.couponBgImg))),
borderRadius: BorderRadius.circular(2.5),
color: HexColor.fromHex(styleModel
.couponCommission.left.couponBgColor),
image: DecorationImage(
image: CachedNetworkImageProvider(
styleModel.couponCommission.left
.couponBgImg))),
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2),
padding: const EdgeInsets.only(
left: 8, right: 8, top: 2, bottom: 2),
child: Text( child: Text(
(good.coupon ?? "") + (styleModel.couponCommission.left.couonText ?? ""),
style: TextStyle(color: HexColor.fromHex(styleModel.couponCommission.left.couponFontColor), fontSize: 22.sp, fontFamily: 'Din', package: 'zhiying_base_widget'),
(good.coupon ?? "") +
(styleModel.couponCommission.left
.couonText ??
""),
style: TextStyle(
color: HexColor.fromHex(styleModel
.couponCommission
.left
.couponFontColor),
fontSize: 22.sp,
fontFamily: 'Din',
package: 'zhiying_base_widget'),
), ),
), ),
), ),
@@ -106,14 +141,33 @@ class HotRankingGoods extends StatelessWidget {
: Container( : Container(
margin: EdgeInsets.only(top: 4, bottom: 4), margin: EdgeInsets.only(top: 4, bottom: 4),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2.5),
color: HexColor.fromHex(styleModel.couponCommission.right.commissionBgColor ?? ""),
image: DecorationImage(image: CachedNetworkImageProvider(styleModel.couponCommission.right.commissionBgImg ?? ""))),
borderRadius: BorderRadius.circular(2.5),
color: HexColor.fromHex(styleModel
.couponCommission
.right
.commissionBgColor ??
""),
image: DecorationImage(
image: CachedNetworkImageProvider(
styleModel.couponCommission.right
.commissionBgImg ??
""))),
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2),
padding: const EdgeInsets.only(
left: 8, right: 8, top: 2, bottom: 2),
child: Text( child: Text(
(styleModel.couponCommission.right.commissionText ?? "") + (good.commission ?? ""),
style: TextStyle(color: HexColor.fromHex(styleModel.couponCommission.right.commissionFontColor), fontSize: 22.sp,fontFamily: 'Din', package: 'zhiying_base_widget'),
(styleModel.couponCommission.right
.commissionText ??
"") +
(good.commission ?? ""),
style: TextStyle(
color: HexColor.fromHex(styleModel
.couponCommission
.right
.commissionFontColor),
fontSize: 22.sp,
fontFamily: 'Din',
package: 'zhiying_base_widget'),
), ),
), ),
), ),
@@ -130,12 +184,21 @@ class HotRankingGoods extends StatelessWidget {
padding: EdgeInsets.only(bottom: 6.sp), padding: EdgeInsets.only(bottom: 6.sp),
child: Text( child: Text(
"¥", "¥",
style: TextStyle(color: HexColor.fromHex(styleModel.currentPriceColor ?? ""), fontSize: 20.sp),
style: TextStyle(
color: HexColor.fromHex(
styleModel.currentPriceColor ?? ""),
fontSize: 20.sp),
), ),
), ),
Text( Text(
good.currentPrice ?? "", good.currentPrice ?? "",
style: TextStyle(color: HexColor.fromHex(styleModel.currentPriceColor ?? ""), fontSize: 40.sp,fontWeight: FontWeight.bold ,fontFamily: 'Din', package: 'zhiying_base_widget'),
style: TextStyle(
color: HexColor.fromHex(
styleModel.currentPriceColor ?? ""),
fontSize: 40.sp,
fontWeight: FontWeight.bold,
fontFamily: 'Din',
package: 'zhiying_base_widget'),
), ),
SizedBox( SizedBox(
width: 6, width: 6,
@@ -144,7 +207,13 @@ class HotRankingGoods extends StatelessWidget {
padding: EdgeInsets.only(bottom: 4.sp), padding: EdgeInsets.only(bottom: 4.sp),
child: Text( child: Text(
"¥" + good.marketPrice ?? "", "¥" + good.marketPrice ?? "",
style: TextStyle(color: HexColor.fromHex(styleModel.marketPriceColor ?? ""), fontSize: 22.sp, decoration: TextDecoration.lineThrough, fontFamily: 'Din', package: 'zhiying_base_widget'),
style: TextStyle(
color: HexColor.fromHex(
styleModel.marketPriceColor ?? ""),
fontSize: 22.sp,
decoration: TextDecoration.lineThrough,
fontFamily: 'Din',
package: 'zhiying_base_widget'),
), ),
), ),
], ],
@@ -167,11 +236,17 @@ class HotRankingGoods extends StatelessWidget {
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: 40.w, left: 40.w,
), ),
margin: EdgeInsets.only(right: 20, left: 20.w),
color: HexColor.fromHex(styleModel.hotRank.bgColor ?? ""),
margin:
EdgeInsets.only(right: 20, left: 20.w),
color: HexColor.fromHex(
styleModel.hotRank.bgColor ?? ""),
child: Text( child: Text(
"热销" + good.inorderCount + "件", "热销" + good.inorderCount + "件",
style: TextStyle(color: Colors.white, fontSize: 22.sp, fontFamily: 'Din', package: 'zhiying_base_widget'),
style: TextStyle(
color: Colors.white,
fontSize: 22.sp,
fontFamily: 'Din',
package: 'zhiying_base_widget'),
), ),
)) ))
], ],
@@ -180,10 +255,12 @@ class HotRankingGoods extends StatelessWidget {
width: 48.w, width: 48.w,
height: 48.w, height: 48.w,
child: CachedNetworkImage( child: CachedNetworkImage(
imageUrl: styleModel?.hotRank?.hotSaleImg ?? "",
imageUrl:
styleModel?.hotRank?.hotSaleImg ?? "",
width: 48.w, width: 48.w,
height: 48.w, height: 48.w,
placeholder: (context, _) => Container(color: Colors.yellow),
placeholder: (context, _) =>
Container(color: Colors.yellow),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
), ),
@@ -193,8 +270,13 @@ class HotRankingGoods extends StatelessWidget {
height: 48.h, height: 48.h,
width: 127.w, width: 127.w,
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage(image: CachedNetworkImageProvider(styleModel.hotRank.buyNowImg ?? ""), fit: BoxFit.fitWidth),
borderRadius: BorderRadius.circular(20)),
image: DecorationImage(
image: CachedNetworkImageProvider(
styleModel.hotRank.buyNowImg ??
""),
fit: BoxFit.fitWidth),
borderRadius:
BorderRadius.circular(20)),
margin: EdgeInsets.only(right: 0), margin: EdgeInsets.only(right: 0),
)) ))
], ],
@@ -210,7 +292,9 @@ class HotRankingGoods extends StatelessWidget {
Align( Align(
alignment: Alignment.topLeft, alignment: Alignment.topLeft,
child: Container( child: Container(
decoration: BoxDecoration(image: DecorationImage(image: CachedNetworkImageProvider(indexImage ?? ""))),
decoration: BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(indexImage ?? ""))),
margin: EdgeInsets.only(left: 40.w, top: 8.h), margin: EdgeInsets.only(left: 40.w, top: 8.h),
height: 60.w, height: 60.w,
width: 60.w, width: 60.w,


+ 5
- 0
lib/widgets/hot_ranking/hot_ranking_list/hot_ranking_bloc.dart View File

@@ -1,6 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:zhiying_base_widget/dialog/loading/loading_dialog.dart';
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart'; import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart';
import 'package:zhiying_comm/util/base_bloc.dart'; import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart'; import 'package:zhiying_comm/zhiying_comm.dart';
@@ -35,6 +39,7 @@ class HotRankingListBloc extends BlocBase {
NetUtil.request( NetUtil.request(
'/api/v1/rec/taobao?type_id=' + typeId + '&page=' + page.toString(), '/api/v1/rec/taobao?type_id=' + typeId + '&page=' + page.toString(),
method: NetMethod.GET, onSuccess: (data) { method: NetMethod.GET, onSuccess: (data) {

complete(); complete();
isLoading = false; isLoading = false;
_loadData(data); _loadData(data);


+ 11
- 7
lib/widgets/hot_ranking/hot_ranking_list/hot_ranking_list.dart View File

@@ -2,6 +2,7 @@ import 'dart:convert';


import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:zhiying_base_widget/dialog/loading/loading_dialog.dart';
import 'package:zhiying_base_widget/pages/hot_ranking_page/hot_ranking_page_bloc.dart'; import 'package:zhiying_base_widget/pages/hot_ranking_page/hot_ranking_page_bloc.dart';
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart'; import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart';
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart'; import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_list/model/hot_ranking_list_data_model.dart';
@@ -23,7 +24,7 @@ class HotRankingList extends StatefulWidget {
} }


class _HotRankingState extends State<HotRankingList> class _HotRankingState extends State<HotRankingList>
with TickerProviderStateMixin {
with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
HotRankingListBloc _bloc; HotRankingListBloc _bloc;
TabController _tabController; TabController _tabController;
RefreshController _refreshController; RefreshController _refreshController;
@@ -33,6 +34,8 @@ class _HotRankingState extends State<HotRankingList>


ScrollController _scrollcontroller; ScrollController _scrollcontroller;


bool isFirstTime=true;

@override @override
void initState() { void initState() {
_bloc = HotRankingListBloc(); _bloc = HotRankingListBloc();
@@ -45,6 +48,8 @@ class _HotRankingState extends State<HotRankingList>
if (event.containsKey('type') && event['type'] == "loadData") { if (event.containsKey('type') && event['type'] == "loadData") {
_bloc.currentPage = 1; _bloc.currentPage = 1;
_bloc.loadData(event['type_id'], _bloc.currentPage, () {}); _bloc.loadData(event['type_id'], _bloc.currentPage, () {});
_scrollcontroller.animateTo(0,
duration: Duration(milliseconds: 500), curve: Curves.bounceInOut);
} }
}); });
} }
@@ -72,12 +77,7 @@ class _HotRankingState extends State<HotRankingList>
return HotRankingSkeleton(); return HotRankingSkeleton();
} else { } else {
goods = snapshot.data.good; goods = snapshot.data.good;
if (_bloc.currentPage == 1) {
Future.delayed(Duration(milliseconds: 100), () {
_scrollcontroller.animateTo(0,
duration: Duration(milliseconds: 100), curve: Curves.ease);
});
}

return SmartRefresher( return SmartRefresher(
controller: _refreshController, controller: _refreshController,
enablePullDown: true, enablePullDown: true,
@@ -121,4 +121,8 @@ class _HotRankingState extends State<HotRankingList>
index: index, index: index,
); );
} }

@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
} }

Loading…
Cancel
Save