| @@ -61,8 +61,8 @@ class CustomItemPageBloc extends Bloc<CustomItemPageEvent, CustomItemPageState> | |||
| Stream<CustomItemPageState> _mapRefreshEventToState(CustomItemPageRefreshEvent event) async* { | |||
| var netStyle = await repository.fetchNetStyle(); | |||
| if (!EmptyUtil.isEmpty(netStyle)) { | |||
| yield CustomItemPageRefreshSuccessState(); | |||
| yield CustomItemPageLoadedState(model: netStyle); | |||
| yield CustomItemPageRefreshSuccessState(); | |||
| } else { | |||
| yield CustomItemPageRefreshErrorState(); | |||
| yield CustomItemPageErrorState(); | |||
| @@ -28,6 +28,9 @@ class CustomItemPageLoadSuccessState extends CustomItemPageState {} | |||
| /// 上拉更多失败 | |||
| class CustomItemPageLoadErrorState extends CustomItemPageState {} | |||
| /// 没有更多数据的情况 | |||
| class CustomItemPageNoMoreDataState extends CustomItemPageState {} | |||
| /// 其他错误 | |||
| class CustomItemPageErrorState extends CustomItemPageState {} | |||
| @@ -89,10 +89,6 @@ class __CustomItemPageContainerState extends BasePageState<_CustomItemPageContai | |||
| /// 刷新 | |||
| void _refreshEvent() { | |||
| BlocProvider.of<CustomItemPageBloc>(context).add(CustomItemPageRefreshEvent()); | |||
| ///刷新页面 | |||
| refreshPage(); | |||
| } | |||
| /// 下拉更多 | |||
| @@ -129,22 +125,34 @@ class __CustomItemPageContainerState extends BasePageState<_CustomItemPageContai | |||
| return BlocConsumer<CustomItemPageBloc, CustomItemPageState>( | |||
| listener: (context, state) {}, | |||
| buildWhen: (prev, current) { | |||
| /// 下拉刷新成功 | |||
| if (current is CustomItemPageRefreshSuccessState) { | |||
| _refreshController?.refreshCompleted(resetFooterState: true); | |||
| ///刷新页面 | |||
| refreshPage(); | |||
| return false; | |||
| } | |||
| /// 下拉刷新出错 | |||
| if (current is CustomItemPageRefreshErrorState) { | |||
| _refreshController?.refreshFailed(); | |||
| return false; | |||
| } | |||
| /// 上拉加载数据成功 | |||
| if (current is CustomItemPageLoadSuccessState) { | |||
| _refreshController?.loadComplete(); | |||
| return false; | |||
| } | |||
| /// 上拉加载数据出错 | |||
| if (current is CustomItemPageLoadErrorState) { | |||
| _refreshController?.loadNoData(); | |||
| return false; | |||
| } | |||
| /// 上拉加载没有更多数据 | |||
| if (current is CustomItemPageNoMoreDataState) { | |||
| _refreshController?.loadNoData(); | |||
| return false; | |||
| } | |||
| /// 数据加载出错 | |||
| if (current is CustomItemPageErrorState) { | |||
| return false; | |||
| } | |||
| @@ -4,6 +4,7 @@ import 'dart:math'; | |||
| import 'package:bloc/bloc.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:zhiying_comm/util/empty_util.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import './bloc.dart'; | |||
| @@ -25,8 +26,9 @@ class CustomQuickEntryBloc extends Bloc<CustomQuickEntryEvent, CustomQuickEntryS | |||
| /// 初始化 | |||
| Stream<CustomQuickEntryState> _mapHomeQuickEntryInitToState(CustomQuickEntryInitEvent event) async* { | |||
| /// 获取父页面传进来的数据 | |||
| var parentData = await repository.fetchPreantData(event: event); | |||
| var parentData = repository.fetchParentData(model: event?.model); | |||
| if (!EmptyUtil.isEmpty(parentData)) { | |||
| Logger.log('多言导航 == ' + parentData?.toJson()?.toString()); | |||
| yield CustomQuickEntryLoadedState(model: parentData); | |||
| } else { | |||
| yield CustomQuickEntryErrorState(); | |||
| @@ -1,10 +1,5 @@ | |||
| import 'package:equatable/equatable.dart'; | |||
| abstract class CustomQuickEntryEvent extends Equatable { | |||
| abstract class CustomQuickEntryEvent { | |||
| const CustomQuickEntryEvent(); | |||
| @override | |||
| List<Object> get props => []; | |||
| } | |||
| /// 初始事件 | |||
| @@ -12,7 +7,4 @@ class CustomQuickEntryInitEvent extends CustomQuickEntryEvent { | |||
| final Map<String, dynamic> model; | |||
| const CustomQuickEntryInitEvent({this.model}); | |||
| @override | |||
| List<Object> get props => [this.model]; | |||
| } | |||
| @@ -10,11 +10,11 @@ import 'custom_quick_entry_event.dart'; | |||
| class CustomQuickEntryRepository { | |||
| /// 获取数据 | |||
| Future<CustomQuickEntryModel> fetchData({@required CustomQuickEntryInitEvent event}) async { | |||
| Future<CustomQuickEntryModel> fetchData({@required Map<String, dynamic> model}) async { | |||
| try { | |||
| var result = await NetUtil.post('/api/v1/mod/${event.model['mod_id']}', | |||
| var result = await NetUtil.post('/api/v1/mod/${model['mod_id']}', | |||
| params: { | |||
| 'ids': [event.model['mod_id']] | |||
| 'ids': [model['mod_id']] | |||
| }, | |||
| cache: true, | |||
| method: NetMethod.GET); | |||
| @@ -31,9 +31,9 @@ class CustomQuickEntryRepository { | |||
| } | |||
| /// 获取父页面传进来的数据 | |||
| Future<CustomQuickEntryModel> fetchPreantData({@required CustomQuickEntryInitEvent event}) async { | |||
| CustomQuickEntryModel fetchParentData({@required Map<String, dynamic> model}) { | |||
| try { | |||
| String jsonStr = event.model['data']; | |||
| String jsonStr = model['data']; | |||
| return CustomQuickEntryModel.fromJson(json.decode(jsonStr)); | |||
| } catch (e, s) { | |||
| Logger.error(e, s); | |||
| @@ -42,10 +42,10 @@ class CustomQuickEntryRepository { | |||
| } | |||
| /// 获取缓存数据 | |||
| Future<CustomQuickEntryModel> fetchCachedData({@required CustomQuickEntryInitEvent event}) async { | |||
| Future<CustomQuickEntryModel> fetchCachedData({@required Map<String, dynamic> model}) async { | |||
| try { | |||
| var result = await NetUtil.getRequestCachedData('/api/v1/mod/${event.model['mod_id']}', params: { | |||
| 'ids': [event.model['mod_id']] | |||
| var result = await NetUtil.getRequestCachedData('/api/v1/mod/${model['mod_id']}', params: { | |||
| 'ids': [model['mod_id']] | |||
| }); | |||
| if (!EmptyUtil.isEmpty(result)) { | |||
| return _getHomeQuickEntryModel(result); | |||
| @@ -18,12 +18,13 @@ class InitialCustomQuickEntryState extends CustomQuickEntryState { | |||
| /// 加载数据完毕 | |||
| class CustomQuickEntryLoadedState extends CustomQuickEntryState { | |||
| final CustomQuickEntryModel model; | |||
| const CustomQuickEntryLoadedState({@required this.model}); | |||
| CustomQuickEntryModel model; | |||
| CustomQuickEntryLoadedState({@required this.model}); | |||
| // @override | |||
| // List<Object> get props => [this.model]; | |||
| @override | |||
| List<Object> get props => [this.model]; | |||
| bool operator == (Object other) => false; | |||
| } | |||
| /// 加载缓存数据 | |||
| @@ -2,7 +2,6 @@ import 'dart:async'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter_bloc/flutter_bloc.dart'; | |||
| import 'package:flutter_swiper/flutter_swiper.dart'; | |||
| import 'package:zhiying_base_widget/widgets/base_state/base_state.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| @@ -11,83 +10,96 @@ import 'custom_quick_entry_sk.dart'; | |||
| import 'model/custom_quick_entry_model.dart'; | |||
| import 'bloc/bloc.dart'; | |||
| class CustomQuickEntry extends StatelessWidget { | |||
| class CustomQuickEntry extends StatefulWidget { | |||
| final Map<String, dynamic> model; | |||
| const CustomQuickEntry(this.model); | |||
| const CustomQuickEntry(this.model, {Key key}) : super(key: key); | |||
| @override | |||
| _CustomQuickEntryState createState() => _CustomQuickEntryState(); | |||
| } | |||
| class _CustomQuickEntryState extends BaseWidgetState<CustomQuickEntry> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { | |||
| CustomQuickEntryModel model; | |||
| CustomQuickEntryRepository _repository; | |||
| @override | |||
| bool get wantKeepAlive => true; | |||
| @override | |||
| void refreshWidget(String value) { | |||
| setState(() { | |||
| Logger.log('多言导航 ===== ' + widget?.model?.toString()); | |||
| model = _repository.fetchParentData(model: widget?.model); | |||
| }); | |||
| } | |||
| @override | |||
| void initState() { | |||
| _repository = CustomQuickEntryRepository(); | |||
| model = _repository.fetchParentData(model: widget?.model); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| void dispose() { | |||
| model = null; | |||
| _repository = null; | |||
| super.dispose(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocProvider<CustomQuickEntryBloc>( | |||
| create: (_) { | |||
| return CustomQuickEntryBloc(repository: CustomQuickEntryRepository())..add(CustomQuickEntryInitEvent(model: model)); | |||
| }, | |||
| child: _CustomQuickEntryContainer(model), | |||
| ); | |||
| /// 空视图 | |||
| if (EmptyUtil.isEmpty(model)) { | |||
| return CustomQuickEntrySkeleton(); | |||
| } | |||
| if (model.isShowCategory == "1") { // 有分类 | |||
| return CustomQuickCateEntry(model: model); | |||
| } else { // 无分类 | |||
| return CustomQuickNormalEntry(model: model); | |||
| } | |||
| } | |||
| } | |||
| class _CustomQuickEntryContainer extends StatefulWidget { | |||
| final Map<String, dynamic> model; | |||
| } | |||
| _CustomQuickEntryContainer(this.model, {Key key}) : super(key: key); | |||
| /// | |||
| /// 无分类多眼导航 | |||
| /// | |||
| class CustomQuickNormalEntry extends StatefulWidget { | |||
| CustomQuickEntryModel model; | |||
| CustomQuickNormalEntry({this.model}); | |||
| @override | |||
| __CustomQuickEntryContainerState createState() => __CustomQuickEntryContainerState(); | |||
| _CustomQuickNormalEntryState createState() => _CustomQuickNormalEntryState(); | |||
| } | |||
| class __CustomQuickEntryContainerState extends BaseWidgetState<_CustomQuickEntryContainer> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { | |||
| class _CustomQuickNormalEntryState extends State<CustomQuickNormalEntry> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { | |||
| SwiperController _controller; | |||
| /// Icon点击事件 | |||
| void _itemIconClick(ListStyle model) { | |||
| print("item type = ${model.skipIdentifier}"); | |||
| // Navigator.push(context, CupertinoPageRoute(builder: (_) => CommonPage(null))); | |||
| RouterUtil.route(model, model.toJson(), context); | |||
| } | |||
| SwiperController _controller; | |||
| @override | |||
| void initState() { | |||
| _controller = SwiperController(); | |||
| print(widget?.model); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| void dispose() { | |||
| _controller?.dispose(); | |||
| super.dispose(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocConsumer<CustomQuickEntryBloc, CustomQuickEntryState>( | |||
| listener: (context, state) {}, | |||
| buildWhen: (prev, current) { | |||
| if (prev is CustomQuickEntryLoadedState) { | |||
| return false; | |||
| } | |||
| return true; | |||
| }, | |||
| builder: (context, state) { | |||
| print("构建"); | |||
| if (state is CustomQuickEntryCachedState) { | |||
| return _getMainWidget(state.model); | |||
| } | |||
| if (state is CustomQuickEntryLoadedState) { | |||
| if (state.model.isShowCategory == "1") { | |||
| return CustomQuickCateEntry(model: state.model); | |||
| } else { | |||
| return _getMainWidget(state.model); | |||
| } | |||
| } | |||
| if (state is CustomQuickEntryErrorState) { | |||
| return Container(); | |||
| } | |||
| return CustomQuickEntrySkeleton(); | |||
| }, | |||
| ); | |||
| return _getMainWidget(widget?.model); | |||
| } | |||
| Widget _getMainWidget(CustomQuickEntryModel model) { | |||
| @@ -261,15 +273,15 @@ class __CustomQuickEntryContainerState extends BaseWidgetState<_CustomQuickEntry | |||
| /// 行的数据 | |||
| Widget _getRowWidget( | |||
| {double titleHeight, | |||
| double iconHeight, | |||
| int totalPage, | |||
| int currentPage, | |||
| int columSize, | |||
| int totalRowSize, | |||
| int totalDataSize, | |||
| CustomQuickEntryModel model, | |||
| int currentRow, | |||
| double itemHeight}) { | |||
| double iconHeight, | |||
| int totalPage, | |||
| int currentPage, | |||
| int columSize, | |||
| int totalRowSize, | |||
| int totalDataSize, | |||
| CustomQuickEntryModel model, | |||
| int currentRow, | |||
| double itemHeight}) { | |||
| List itemList = []; | |||
| for (int i = 0; i < columSize; i++) { | |||
| itemList.add(i); | |||
| @@ -299,16 +311,16 @@ class __CustomQuickEntryContainerState extends BaseWidgetState<_CustomQuickEntry | |||
| /// item 的数据 | |||
| Widget _getColumWidget( | |||
| {double titleHeight, | |||
| double iconHeight, | |||
| int totalPage, | |||
| int currentPage, | |||
| int columSize, | |||
| int totalRowSize, | |||
| int totalDataSize, | |||
| CustomQuickEntryModel model, | |||
| int currentRow, | |||
| int currentColum, | |||
| double itemHeight}) { | |||
| double iconHeight, | |||
| int totalPage, | |||
| int currentPage, | |||
| int columSize, | |||
| int totalRowSize, | |||
| int totalDataSize, | |||
| CustomQuickEntryModel model, | |||
| int currentRow, | |||
| int currentColum, | |||
| double itemHeight}) { | |||
| // 当前index = 当前的页数+1 * 当前的行数 + 当前的列数 | |||
| // int currentIndex = (currentPage + 1) * currentRow + currentColum + currentRow*columSize; | |||
| // int currentIndex = currentPage != 0 ? currentPage * (columSize * totalRowSize) + columSize + currentRow * columSize : | |||
| @@ -447,33 +459,15 @@ class __CustomQuickEntryContainerState extends BaseWidgetState<_CustomQuickEntry | |||
| }); | |||
| } | |||
| @override | |||
| // TODO: implement wantKeepAlive | |||
| bool get wantKeepAlive => true; | |||
| @override | |||
| void refreshWidget(String value) { | |||
| setState(() {}); | |||
| } | |||
| bool get wantKeepAlive => true; | |||
| } | |||
| /// | |||
| /// 图片build 优化 | |||
| /// 有分类多眼导航 | |||
| /// | |||
| class MyNetWorkImage extends StatelessWidget { | |||
| final String imgUrl; | |||
| final double width; | |||
| const MyNetWorkImage(this.imgUrl, {this.width = 40}); | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return RepaintBoundary( | |||
| child: CachedNetworkImage(width: width, imageUrl: imgUrl), | |||
| ); | |||
| } | |||
| } | |||
| class CustomQuickCateEntry extends StatefulWidget { | |||
| final CustomQuickEntryModel model; | |||
| @@ -483,7 +477,8 @@ class CustomQuickCateEntry extends StatefulWidget { | |||
| _CustomQuickCateEntryState createState() => _CustomQuickCateEntryState(); | |||
| } | |||
| class _CustomQuickCateEntryState extends BaseWidgetState<CustomQuickCateEntry> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { | |||
| class _CustomQuickCateEntryState extends State<CustomQuickCateEntry> with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { | |||
| TabController tabController; | |||
| bool isOnTap = false; | |||
| @@ -980,11 +975,6 @@ class _CustomQuickCateEntryState extends BaseWidgetState<CustomQuickCateEntry> w | |||
| @override | |||
| bool get wantKeepAlive => true; | |||
| @override | |||
| void refreshWidget(String value) { | |||
| BlocProvider.of<CustomQuickEntryBloc>(context).add(CustomQuickEntryInitEvent(model: widget?.model?.toJson())); | |||
| } | |||
| } | |||
| class PageItem { | |||
| @@ -994,3 +984,20 @@ class PageItem { | |||
| List<ListStyle> listStyle; | |||
| } | |||
| /// | |||
| /// 图片build 优化 | |||
| /// | |||
| class MyNetWorkImage extends StatelessWidget { | |||
| final String imgUrl; | |||
| final double width; | |||
| const MyNetWorkImage(this.imgUrl, {this.width = 40}); | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return RepaintBoundary( | |||
| child: CachedNetworkImage(width: width, imageUrl: imgUrl), | |||
| ); | |||
| } | |||
| } | |||
| @@ -21,7 +21,7 @@ class CustomNoticeBloc extends Bloc<CustomNoticeEvent, CustomNoticeState> { | |||
| /// 初始化 | |||
| Stream<CustomNoticeState> _mapInitEventToState(CustomNoticeInitEvent event) async* { | |||
| var parentData = await repository.fetchParentData(event); | |||
| var parentData = repository.fetchParentData(event?.model); | |||
| if(!EmptyUtil.isEmpty(parentData)) | |||
| yield CustomNoticeLoadedState(model: parentData); | |||
| else | |||
| @@ -4,9 +4,9 @@ import 'bloc.dart'; | |||
| class CustomNoticeRepository { | |||
| /// 获取父页面的数据 | |||
| Future<CustomNoticeModel> fetchParentData(CustomNoticeInitEvent event) async { | |||
| CustomNoticeModel fetchParentData(final Map<String, dynamic> model) { | |||
| try { | |||
| String jsonStr = event.model['data']; | |||
| String jsonStr = model['data']; | |||
| return CustomNoticeModel.fromJson(jsonDecode(jsonStr)); | |||
| } catch (e) { | |||
| Logger.log(e); | |||
| @@ -6,32 +6,24 @@ import 'package:cached_network_image/cached_network_image.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import 'bloc/bloc.dart'; | |||
| import 'custom_notice_sk.dart'; | |||
| import 'package:zhiying_base_widget/widgets/base_state/base_state.dart'; | |||
| /// | |||
| /// 公告滚动widget | |||
| /// | |||
| class CustomNoticeWidget extends StatelessWidget { | |||
| class CustomNoticeWidget extends StatefulWidget { | |||
| final Map<String, dynamic> model; | |||
| const CustomNoticeWidget(this.model); | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocProvider<CustomNoticeBloc>( | |||
| create: (_) => | |||
| CustomNoticeBloc(repository: CustomNoticeRepository()) | |||
| ..add(CustomNoticeInitEvent(model: model)), | |||
| child: _CustomNoticeWidgetContainer(), | |||
| ); | |||
| } | |||
| _CustomNoticeWidgetState createState() => _CustomNoticeWidgetState(); | |||
| } | |||
| class _CustomNoticeWidgetContainer extends StatefulWidget { | |||
| @override | |||
| _CustomNoticeWidgetContainerState createState() => _CustomNoticeWidgetContainerState(); | |||
| } | |||
| class _CustomNoticeWidgetState extends BaseWidgetState<CustomNoticeWidget> { | |||
| CustomNoticeModel model; | |||
| CustomNoticeRepository _repository; | |||
| class _CustomNoticeWidgetContainerState extends State<_CustomNoticeWidgetContainer> { | |||
| /// 子item点击事件 | |||
| void _itemOnClick(CustomNoticeModel model) { | |||
| if (pageIndex == model.listStyle.length) { | |||
| @@ -48,20 +40,33 @@ class _CustomNoticeWidgetContainerState extends State<_CustomNoticeWidgetContain | |||
| RouterUtil.route(model, model.toJson(), context); | |||
| } | |||
| @override | |||
| void refreshWidget(String value) { | |||
| setState(() { | |||
| model = _repository.fetchParentData(widget?.model); | |||
| }); | |||
| } | |||
| @override | |||
| void initState() { | |||
| _repository = new CustomNoticeRepository(); | |||
| model = _repository.fetchParentData(widget?.model); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| void dispose() { | |||
| model = null; | |||
| _repository = null; | |||
| super.dispose(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocConsumer<CustomNoticeBloc, CustomNoticeState>( | |||
| listener: (context, state) {}, | |||
| buildWhen: (prev, current) { | |||
| return true; | |||
| }, | |||
| builder: (context, state) { | |||
| if (state is CustomNoticeLoadedState) { | |||
| return _getMainWidget(state?.model); | |||
| } | |||
| return CustomNoticeSkeleton(); | |||
| }, | |||
| ); | |||
| if (!EmptyUtil.isEmpty(model)) | |||
| return _getMainWidget(model); | |||
| else | |||
| return CustomNoticeSkeleton(); | |||
| } | |||
| /// 主体页面 | |||
| @@ -138,8 +143,10 @@ class _CustomNoticeWidgetContainerState extends State<_CustomNoticeWidgetContain | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| // 上下滚动的消息轮播 | |||
| class MarqueeWidget extends StatefulWidget { | |||
| int count; // 子视图数量 | |||
| @@ -26,7 +26,7 @@ class CustomSlideBannerBloc extends Bloc<CustomSlideBannerEvent, CustomSlideBann | |||
| /// 初始化 | |||
| Stream<CustomSlideBannerState> _mapInitEventToState(CustomBannerInitEvent event) async* { | |||
| var parent = await repository.fetchPreantData(event.model); | |||
| var parent = repository.fetchParentData(event.model); | |||
| if (!EmptyUtil.isEmpty(parent)) { | |||
| yield HomeSlideBannerLoadedState(datas: parent); | |||
| return; | |||
| @@ -19,7 +19,7 @@ class CustomSlideBannerRepository { | |||
| } | |||
| /// 获取父页面传进来的数据 | |||
| Future<CustomSlideBannerModel> fetchPreantData(@required Map<String, dynamic> model) async { | |||
| CustomSlideBannerModel fetchParentData(@required Map<String, dynamic> model) { | |||
| try { | |||
| if (!EmptyUtil.isEmpty(model)) { | |||
| return CustomSlideBannerModel.fromJson(jsonDecode(model['data'])); | |||
| @@ -1,7 +1,6 @@ | |||
| import 'package:cached_network_image/cached_network_image.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter_bloc/flutter_bloc.dart'; | |||
| import 'package:flutter_swiper/flutter_swiper.dart'; | |||
| import 'package:provider/provider.dart'; | |||
| import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; | |||
| @@ -10,6 +9,7 @@ import 'bloc/bloc.dart'; | |||
| import 'bloc/custom_slide_banner_repository.dart'; | |||
| import 'custom_slide_banner_sk.dart'; | |||
| import 'model/custom_slide_banner_model.dart'; | |||
| import 'package:zhiying_base_widget/widgets/base_state/base_state.dart'; | |||
| /// | |||
| /// 可滑动 banner 轮播图 | |||
| @@ -23,71 +23,48 @@ class CustomSlideBanner extends StatefulWidget { | |||
| _CustomSlideBannerState createState() => _CustomSlideBannerState(); | |||
| } | |||
| class _CustomSlideBannerState extends State<CustomSlideBanner> { | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocProvider<CustomSlideBannerBloc>( | |||
| create: (_) => CustomSlideBannerBloc(repository: CustomSlideBannerRepository())..add(CustomBannerInitEvent(model: widget?.model)), | |||
| child: CustomSlideBannerContainer(), | |||
| ); | |||
| } | |||
| } | |||
| class _CustomSlideBannerState extends BaseWidgetState<CustomSlideBanner> { | |||
| class CustomSlideBannerContainer extends StatefulWidget { | |||
| @override | |||
| _CustomSlideBannerContainerState createState() => _CustomSlideBannerContainerState(); | |||
| } | |||
| CustomSlideBannerRepository _repository; | |||
| CustomSlideBannerModel model; | |||
| SwiperController _swiperController; | |||
| class _CustomSlideBannerContainerState extends State<CustomSlideBannerContainer> { | |||
| /// 子元素点击事件 | |||
| void _itemOnClick(IndexCarouselList model) { | |||
| print('点击了 $model'); | |||
| RouterUtil.route(model, model.toJson(), context); | |||
| // Navigator.push(context, CupertinoPageRoute(builder: (_) => VipCenterPage(null))); | |||
| } | |||
| SwiperController _swiperController; | |||
| @override | |||
| void initState() { | |||
| _swiperController = SwiperController(); | |||
| _repository = CustomSlideBannerRepository(); | |||
| model = _repository.fetchParentData(widget?.model); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| void refreshWidget(String value) { | |||
| setState(() { | |||
| model = _repository.fetchParentData(widget?.model); | |||
| }); | |||
| } | |||
| @override | |||
| void dispose() { | |||
| _swiperController.stopAutoplay(); | |||
| _swiperController?.stopAutoplay(); | |||
| _swiperController?.dispose(); | |||
| _repository = null; | |||
| model = null; | |||
| super.dispose(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return BlocConsumer<CustomSlideBannerBloc, CustomSlideBannerState>( | |||
| listener: (BuildContext context, CustomSlideBannerState state) { | |||
| if (state is HomeSlideBannerLoadError) { | |||
| print('数据加载出错'); | |||
| } | |||
| }, | |||
| buildWhen: (previous, current) { | |||
| /// 数据加载出错不进行build | |||
| if (current is HomeSlideBannerLoadError) { | |||
| return false; | |||
| } | |||
| return true; | |||
| }, | |||
| builder: (context, state) { | |||
| print('currente state = $state'); | |||
| if (state is HomeSlideBannerLoadedState) { | |||
| return _getMainWidget(state.datas); | |||
| } | |||
| if (state is CustomSlideBannerCachedState) { | |||
| return _getMainWidget(state.datas); | |||
| } | |||
| // 骨架屏 | |||
| return CustomSlideBannerSkeleton(); | |||
| }, | |||
| ); | |||
| if (!EmptyUtil.isEmpty(model)) | |||
| return _getMainWidget(model); | |||
| else | |||
| return CustomSlideBannerSkeleton(); | |||
| } | |||
| Widget _getMainWidget(CustomSlideBannerModel datas) { | |||
| @@ -260,3 +237,4 @@ class _CustomSlideBannerContainerState extends State<CustomSlideBannerContainer> | |||
| margin: const EdgeInsets.only(), builder: DotSwiperPaginationBuilder(color: HexColor.fromHex(unselectColor), activeColor: HexColor.fromHex(selectColor), size: 8, activeSize: 8)); | |||
| } | |||
| } | |||