@@ -1,14 +1,12 @@ | |||
import 'dart:async'; | |||
import 'package:bloc/bloc.dart'; | |||
import 'package:equatable/equatable.dart'; | |||
import 'package:flutter/cupertino.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_repository.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
part 'search_result_item_event.dart'; | |||
part 'search_result_item_state.dart'; | |||
import 'search_result_item_state.dart'; | |||
import 'search_result_item_event.dart'; | |||
class SearchResultItemBloc extends Bloc<SearchResultItemEvent, SearchResultItemState> { | |||
// SearchResultItemBloc() : super(SearchResultItemInitial()); | |||
@@ -23,9 +21,26 @@ class SearchResultItemBloc extends Bloc<SearchResultItemEvent, SearchResultItemS | |||
Stream<SearchResultItemState> mapEventToState( | |||
SearchResultItemEvent event, | |||
) async* { | |||
/// 初始化 | |||
if (event is SearchResultItemInitEvent) { | |||
yield* _mapInitEventToState(event); | |||
} | |||
/// 下拉刷新成功事件 | |||
if(event is SearchResultItemRefreshSuccessEvent) { | |||
yield SearchResultItemRefreshSuccessState(); | |||
} | |||
/// 下拉刷新失败事件 | |||
if(event is SearchResultItemRefreshErrorEvent) { | |||
yield SearchResultItemRefreshErrorState(); | |||
} | |||
/// 上拉更多成功事件 | |||
if(event is SearchResultItemLoadSuccessEvent) { | |||
yield SearchResultItemLoadSuccessState(); | |||
} | |||
/// 上拉更多失败事件 | |||
if(event is SearchResultItemLoadNoMoreEvent) { | |||
yield SearchResultItemLoadNoMoreState(); | |||
} | |||
} | |||
/// 初始化 | |||
@@ -1,7 +1,10 @@ | |||
part of 'search_result_item_bloc.dart'; | |||
import 'package:equatable/equatable.dart'; | |||
import 'package:flutter/material.dart'; | |||
abstract class SearchResultItemEvent extends Equatable { | |||
const SearchResultItemEvent(); | |||
@override | |||
List<Object> get props => []; | |||
} | |||
/// 初始化 | |||
@@ -13,3 +16,21 @@ class SearchResultItemInitEvent extends SearchResultItemEvent{ | |||
@override | |||
List<Object> get props => [this.model]; | |||
} | |||
/// 下拉刷新成功事件 | |||
class SearchResultItemRefreshSuccessEvent extends SearchResultItemEvent { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 下拉刷新失败事件 | |||
class SearchResultItemRefreshErrorEvent extends SearchResultItemEvent { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 上拉更多成功事件 | |||
class SearchResultItemLoadSuccessEvent extends SearchResultItemEvent { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 上拉更多失败事件 | |||
class SearchResultItemLoadNoMoreEvent extends SearchResultItemEvent {} |
@@ -1,4 +1,5 @@ | |||
part of 'search_result_item_bloc.dart'; | |||
import 'package:equatable/equatable.dart'; | |||
import 'package:flutter/material.dart'; | |||
abstract class SearchResultItemState extends Equatable { | |||
const SearchResultItemState(); | |||
@@ -21,3 +22,27 @@ class SearchResultItemLoadedState extends SearchResultItemState { | |||
/// 数据加载失败 | |||
class SearchResultItemErrorState extends SearchResultItemState {} | |||
/// 刷新成功 | |||
class SearchResultItemRefreshSuccessState extends SearchResultItemState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 刷新失败 | |||
class SearchResultItemRefreshErrorState extends SearchResultItemState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 下拉失败 | |||
class SearchResultItemLoadNoMoreState extends SearchResultItemState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 下拉成功 | |||
class SearchResultItemLoadSuccessState extends SearchResultItemState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} |
@@ -1,18 +1,20 @@ | |||
import 'package:flutter/material.dart'; | |||
import 'package:pull_to_refresh/pull_to_refresh.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_bloc.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_repository.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_goods/skeleton/home_goods_sk.dart'; | |||
import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_gif_header.dart'; | |||
import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_header.dart'; | |||
import 'package:zhiying_base_widget/widgets/search_result/goods_list/bloc/search_result_goods_list_bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/search_result/goods_list/bloc/search_result_goods_list_repository.dart'; | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||
import 'package:provider/provider.dart'; | |||
import 'bloc/search_result_item_bloc.dart'; | |||
import 'notifier/search_result_item_page_notifier.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_bloc.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_repository.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_state.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_event.dart'; | |||
import 'package:zhiying_base_widget/widgets/search_result/goods_list/bloc/search_result_goods_list_bloc.dart'; | |||
import 'package:zhiying_base_widget/widgets/search_result/goods_list/bloc/search_result_goods_list_repository.dart'; | |||
class SearchResultItemPage extends StatelessWidget { | |||
final Map<String, dynamic> data; | |||
@@ -96,6 +98,27 @@ class _SearchResultItemPageContianerState extends State<SearchResultItemPageCont | |||
buildWhen: (previous, current) { | |||
/// 数据加载出错不进行build | |||
if (current is SearchResultItemErrorState) { | |||
_refreshController?.loadNoData(); | |||
return false; | |||
} | |||
// 刷新成功 | |||
if (current is SearchResultItemRefreshSuccessState) { | |||
_refreshController?.refreshCompleted(resetFooterState: true); | |||
return false; | |||
} | |||
// 刷新失败 | |||
if (current is SearchResultItemRefreshErrorState) { | |||
_refreshController?.refreshFailed(); | |||
return false; | |||
} | |||
// 下拉加载成功 | |||
if (current is SearchResultItemLoadSuccessState) { | |||
_refreshController?.loadComplete(); | |||
return false; | |||
} | |||
// 下拉加载失败 | |||
if (current is SearchResultItemLoadNoMoreState) { | |||
_refreshController?.loadNoData(); | |||
return false; | |||
} | |||
return true; | |||
@@ -115,13 +138,13 @@ class _SearchResultItemPageContianerState extends State<SearchResultItemPageCont | |||
/// 上拉更多 | |||
void _onLoading() async { | |||
BlocProvider.of<SearchResultGoodsListBloc>(context).add(SearchResultGoodsListOnLoadEvent()); | |||
_refreshController.loadComplete(); | |||
// _refreshController.loadComplete(); | |||
} | |||
/// 下拉刷新 | |||
void _onRefresh() async { | |||
BlocProvider.of<SearchResultGoodsListBloc>(context).add(SearchResultGoodsListOnRefreshEvent()); | |||
_refreshController.refreshCompleted(resetFooterState: true); | |||
// _refreshController.refreshCompleted(resetFooterState: true); | |||
} | |||
/// 获取主视图 | |||
@@ -53,26 +53,6 @@ class SearchResultGoodsListBloc extends Bloc<SearchResultGoodsListEvent, SearchR | |||
if(event is SearchResultGoodsListSortEvent){ | |||
yield* _mapSortEventToState(event); | |||
} | |||
// /// 综合 | |||
// if (event is SearchResultGoodsListZHSortEvent) { | |||
// yield* _mapZhSortEventToState(event); | |||
// } | |||
// | |||
// /// 补贴 | |||
// if (event is SearchResultGoodsListBtSortEvent) { | |||
// yield* _mapBTSortEventToState(event); | |||
// } | |||
// | |||
// /// 优惠券 | |||
// if (event is SearchResultGoodsListYHQSortEvent) { | |||
// yield* _mapYHQSortEventToState(event); | |||
// } | |||
// | |||
// /// 筛选 | |||
// if (event is SearchResultGoodsListSXSortEvent) { | |||
// yield* _mapSXSortEventToState(event); | |||
// } | |||
} | |||
/// 初始化事件 | |||
@@ -89,9 +69,10 @@ class SearchResultGoodsListBloc extends Bloc<SearchResultGoodsListEvent, SearchR | |||
Stream<SearchResultGoodsListState> _mapRefreshToState(SearchResultGoodsListOnRefreshEvent event) async* { | |||
var result = await repository.fetchRefreshData(); | |||
if (!EmptyUtil.isEmpty(result)) { | |||
yield SearchResultGoodsListRefreshSuccessState(); | |||
yield SearchResultGoodsListLoadedState(model: result); | |||
} else { | |||
// yield SearchResultGoodsListErrorState(); | |||
yield SearchResultGoodsListRefreshErrorState(); | |||
} | |||
} | |||
@@ -99,9 +80,10 @@ class SearchResultGoodsListBloc extends Bloc<SearchResultGoodsListEvent, SearchR | |||
Stream<SearchResultGoodsListState> _mapOnLoadToState(SearchResultGoodsListOnLoadEvent event, SearchResultGoodsListLoadedState state) async* { | |||
var result = await repository.fetchLoadData(); | |||
if (!EmptyUtil.isEmpty(result)) { | |||
yield SearchResultGoodsListLoadSuccessState(); | |||
yield SearchResultGoodsListLoadedState(model: result); | |||
} else { | |||
// yield SearchResultGoodsListErrorState(); | |||
yield SearchResultGoodsListNoMoreDataState(); | |||
} | |||
} | |||
@@ -111,7 +93,7 @@ class SearchResultGoodsListBloc extends Bloc<SearchResultGoodsListEvent, SearchR | |||
if (!EmptyUtil.isEmpty(result)) { | |||
yield SearchResultGoodsListChangeStyleState(result['style'], result['datas']); | |||
} else { | |||
// yield SearchResultGoodsListErrorState(); | |||
// yield SearchResultGoodsListNoMoreDataState(); | |||
} | |||
} | |||
@@ -134,44 +116,4 @@ class SearchResultGoodsListBloc extends Bloc<SearchResultGoodsListEvent, SearchR | |||
// yield SearchResultGoodsListErrorState(); | |||
} | |||
} | |||
// /// 综合排序 | |||
// Stream<SearchResultGoodsListState> _mapZhSortEventToState(SearchResultGoodsListZHSortEvent event) async* { | |||
// var result = await repository.fetchZhSort(event.args); | |||
// if (!EmptyUtil.isEmpty(result)) { | |||
// yield SearchResultGoodsListLoadedState(model: result); | |||
// } else { | |||
// yield SearchResultGoodsListErrorState(); | |||
// } | |||
// } | |||
// | |||
// /// 补贴排序 | |||
// Stream<SearchResultGoodsListState> _mapBTSortEventToState(SearchResultGoodsListBtSortEvent event) async* { | |||
// var result = await repository.fetchBt(event.args); | |||
// if (!EmptyUtil.isEmpty(result)) { | |||
// yield SearchResultGoodsListLoadedState(model: result); | |||
// } else { | |||
// yield SearchResultGoodsListErrorState(); | |||
// } | |||
// } | |||
// | |||
// /// 优惠券排序 | |||
// Stream<SearchResultGoodsListState> _mapYHQSortEventToState(SearchResultGoodsListYHQSortEvent event) async* { | |||
// var result = await repository.fetchYhq(event.args); | |||
// if (!EmptyUtil.isEmpty(result)) { | |||
// yield SearchResultGoodsListLoadedState(model: result); | |||
// } else { | |||
// yield SearchResultGoodsListErrorState(); | |||
// } | |||
// } | |||
// | |||
// /// 筛选排序 | |||
// Stream<SearchResultGoodsListState> _mapSXSortEventToState(SearchResultGoodsListSXSortEvent event) async* { | |||
// var result = await repository.fetchSX(event.args); | |||
// if (!EmptyUtil.isEmpty(result)) { | |||
// yield SearchResultGoodsListLoadedState(model: result); | |||
// } else { | |||
// yield SearchResultGoodsListErrorState(); | |||
// } | |||
// } | |||
} |
@@ -99,6 +99,8 @@ class SearchResultGoodsListRepository { | |||
if (data.length >= MAX) { | |||
_hasNomore = true; | |||
++_currentPage; | |||
} else { | |||
_hasNomore = false; | |||
} | |||
// 下拉刷新需要清理 | |||
if (refresh) { | |||
@@ -117,7 +119,6 @@ class SearchResultGoodsListRepository { | |||
} catch (e) { | |||
Logger.error(e); | |||
} | |||
_hasNomore = false; | |||
return null; | |||
} | |||
@@ -43,3 +43,21 @@ class SearchResultGoodsListChangeStyleState extends SearchResultGoodsListState { | |||
@override | |||
List<Object> get props => [this.isShowOneColumn]; | |||
} | |||
/// 没有更多数据 | |||
class SearchResultGoodsListNoMoreDataState extends SearchResultGoodsListState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} | |||
/// 上拉数据成功 | |||
class SearchResultGoodsListLoadSuccessState extends SearchResultGoodsListState {} | |||
/// 刷新数据成功 | |||
class SearchResultGoodsListRefreshSuccessState extends SearchResultGoodsListState {} | |||
/// 刷新数据失败 | |||
class SearchResultGoodsListRefreshErrorState extends SearchResultGoodsListState { | |||
@override | |||
bool operator == (Object other) => false; | |||
} |
@@ -1,7 +1,6 @@ | |||
import 'dart:convert'; | |||
import 'package:flutter/material.dart'; | |||
import 'package:zhiying_base_widget/pages/goods_details_page/goods_details_page.dart'; | |||
import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_item.dart'; | |||
import 'package:zhiying_base_widget/widgets/home/home_goods/home_goods_item_single.dart'; | |||
@@ -12,6 +11,10 @@ import 'package:zhiying_base_widget/widgets/search_result/goods_list/bloc/search | |||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_bloc.dart'; | |||
import 'package:zhiying_base_widget/pages/search_result_page/item/bloc/search_result_item_event.dart'; | |||
class SearchResultGoodsListWidget extends StatefulWidget { | |||
final Map<String, dynamic> data; | |||
HomeGoodsStyleModel style; | |||
@@ -52,16 +55,6 @@ class _SearchResultGoodsListWidgetContainerState extends State<SearchResultGoods | |||
/// 显示样式 | |||
bool _isShowOneColumn = true; | |||
/// 下拉刷新 | |||
void _onRefersh() async { | |||
BlocProvider.of<SearchResultGoodsListBloc>(context).add(SearchResultGoodsListOnRefreshEvent()); | |||
} | |||
/// 上拉更多 | |||
void _onLoad() async { | |||
BlocProvider.of<SearchResultGoodsListBloc>(context).add(SearchResultGoodsListOnLoadEvent()); | |||
} | |||
@override | |||
void initState() { | |||
/// 初始化 | |||
@@ -71,36 +64,34 @@ class _SearchResultGoodsListWidgetContainerState extends State<SearchResultGoods | |||
@override | |||
Widget build(BuildContext context) { | |||
// return BlocConsumer<SearchResultGoodsListBloc, SearchResultGoodsListState>( | |||
// listener: (BuildContext context, SearchResultGoodsListState state) { | |||
// if (state is SearchResultGoodsListErrorState) { | |||
// print('search_result_goods_list_widget = 数据加载出错'); | |||
// } | |||
// }, | |||
// buildWhen: (previous, current) { | |||
// /// 数据加载出错不进行build | |||
// if (current is SearchResultGoodsListErrorState) { | |||
// return false; | |||
// } | |||
// | |||
// return true; | |||
// }, | |||
// builder: (context, state) { | |||
// if (state is SearchResultGoodsListLoadedState) { | |||
// return _getMainWidget(state?.model, widget?.style); | |||
// } | |||
// if (state is SearchResultGoodsListChangeStyleState) { | |||
// _isShowOneColumn = state.isShowOneColumn; | |||
// return _getMainWidget(state?.model, widget?.style); | |||
// } | |||
// | |||
// /// 骨架屏幕 | |||
// return HomeGoodsSkeleton(); | |||
// }, | |||
// ); | |||
return BlocBuilder<SearchResultGoodsListBloc, SearchResultGoodsListState>( | |||
buildWhen: (previous, current) { | |||
/// 没有更多数据 | |||
if (current is SearchResultGoodsListNoMoreDataState) { | |||
// 通知页面的刷新control修改 | |||
BlocProvider.of<SearchResultItemBloc>(context).add(SearchResultItemLoadNoMoreEvent()); | |||
return false; | |||
} | |||
/// 上拉更多数据成功 | |||
if (current is SearchResultGoodsListLoadSuccessState) { | |||
// 通知页面的刷新control修改 | |||
BlocProvider.of<SearchResultItemBloc>(context).add(SearchResultItemLoadSuccessEvent()); | |||
return false; | |||
} | |||
/// 刷新数据成功 | |||
if (current is SearchResultGoodsListRefreshSuccessState) { | |||
// 通知页面的刷新control修改 | |||
BlocProvider.of<SearchResultItemBloc>(context).add(SearchResultItemRefreshSuccessEvent()); | |||
return false; | |||
} | |||
/// 刷新数据失败 | |||
if (current is SearchResultGoodsListRefreshErrorState) { | |||
// 通知页面的刷新control修改 | |||
BlocProvider.of<SearchResultItemBloc>(context).add(SearchResultItemRefreshErrorEvent()); | |||
return false; | |||
} | |||
return true; | |||
}, | |||
builder: (context, state) { | |||
if (state is SearchResultGoodsListLoadedState) { | |||
return _getMainWidget(state?.model, widget?.style); | |||