/* * ==================================================== * package : * author : Created by nansi. * time : 2019/6/27 5:35 PM * remark : * ==================================================== */ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gifimage/flutter_gifimage.dart'; import 'package:get/get.dart'; import 'package:recook/widgets/custom_image_button.dart'; import 'package:waterfall_flow/waterfall_flow.dart'; import 'package:recook/base/base_store_state.dart'; import 'package:recook/constants/header.dart'; import 'package:recook/models/category_model.dart'; import 'package:recook/models/goods_simple_list_model.dart'; import 'package:recook/pages/home/classify/brandgoods_list_page.dart'; import 'package:recook/pages/home/classify/commodity_detail_page.dart'; import 'package:recook/pages/home/items/item_brand_detail_grid.dart'; import 'package:recook/utils/mvp.dart'; import 'package:recook/widgets/custom_app_bar.dart'; import 'package:recook/widgets/filter_tool_bar.dart'; import 'package:recook/widgets/goods_item.dart'; import 'package:recook/widgets/mvp_list_view/mvp_list_view.dart'; import 'package:recook/widgets/mvp_list_view/mvp_list_view_contact.dart'; import '../search_page.dart'; import 'mvp/goods_list_contact.dart'; import 'mvp/goods_list_presenter_impl.dart'; class GoodsListPage extends StatefulWidget { // final SecondCategory category; final Map arguments; const GoodsListPage({Key key, this.arguments}) : super(key: key); static setArguments( {String title, int index, List secondCategoryList, bool isJD = false}) { return { "title": title, "index": index, "secondCategoryList": secondCategoryList, 'isJD': isJD }; } @override State createState() { return _GoodsListPageState(); } } class _GoodsListPageState extends BaseStoreState with MvpListViewDelegate, TickerProviderStateMixin { /// 切换展示形式 true 为 List, false 为grid bool _displayList = false;//默认排列方式改为瀑布流 FilterToolBarController _filterController; SecondCategory _category; List _secondCategoryList; GoodsListPresenterImpl _presenter; TabController _tabController; MvpListViewController _listViewController; SortType _sortType = SortType.comprehensive; int _jDType = 0; // 0 默认数据 1传回全部JD数据 2为JD自营数据 3为JD pop数据 bool _isJD = false; String _jdTypeText = '全部'; int _filterIndex = 0; List _barBool = [false,false,false]; GifController _gifController; TextEditingController _textEditController; String _searchText = ''; @override void initState() { if (widget.arguments['isJD'] != null) { _isJD = widget.arguments['isJD']; } if (_isJD) { _jDType = 1; _sortType = SortType.priceAsc; _barBool = [false,false]; } int index = widget.arguments["index"]; _gifController = GifController(vsync: this) ..repeat( min: 0, max: 20, period: Duration(milliseconds: 700), ); DPrint.printf("index=$index"); _secondCategoryList = widget.arguments["secondCategoryList"]; _category = _secondCategoryList[index]; _tabController = TabController( initialIndex: index, length: _secondCategoryList.length, vsync: this); _filterController = FilterToolBarController(); super.initState(); _presenter = GoodsListPresenterImpl(); _listViewController = MvpListViewController(); } @override void dispose() { _gifController.dispose(); super.dispose(); } @override Widget buildContext(BuildContext context, {store}) { return Scaffold( backgroundColor: AppColor.frenchColor, // appBar: CustomAppBar( // title: _buildTitle(), // // leading: Container(), // themeData: AppThemes.themeDataGrey.appBarTheme, // ), appBar: CustomAppBar( themeData: AppThemes.themeDataGrey.appBarTheme, elevation: 0, title: widget.arguments["title"], ), body: Column( children: [ Container( height: 34, alignment: Alignment.center, color: AppThemes.themeDataGrey.appBarTheme.color, width: MediaQuery.of(context).size.width, child: TabBar( onTap: (index) { _category = _secondCategoryList[index]; _listViewController.stopRefresh(); _listViewController.requestRefresh(); // _presenter.fetchList(_category.id, 0, _sortType); setState(() {}); }, isScrollable: true, labelPadding: EdgeInsets.all(0), controller: _tabController, labelColor: getCurrentThemeColor(), indicatorPadding: EdgeInsets.symmetric(horizontal: rSize(15)), indicatorSize: TabBarIndicatorSize.label, unselectedLabelColor: Colors.black54, labelStyle: TextStyle(color: Colors.black54), indicatorColor: getCurrentThemeColor(), tabs: _tabItems()), ), Container( color: AppColor.frenchColor, height: 5, ), _buildTitle(), Container( color: AppColor.frenchColor, height: 5, ), Expanded( child: FilterToolBarResultContainer( controller: _filterController, body: Column( children: [ _filterToolBar(context), Expanded(child: _buildList(context)) ], ), ), ) ], )); } Widget _buildTitle() { return Container( // margin: EdgeInsets.only(right: rSize(10)), height: 40, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20)), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Container( width: 10, ), Container( padding: EdgeInsets.symmetric(horizontal: 5), child: Icon( Icons.search, size: 20, color: Colors.grey, ), ), Expanded( child: CupertinoTextField( //autofocus: true, keyboardType: TextInputType.text, controller: _textEditController, textInputAction: TextInputAction.search, onSubmitted: (_submitted) { //_contentFocusNode.unfocus(); _presenter.fetchList(_category.id, 0, _sortType, null, JDType: _jDType,keyword: _searchText); setState(() {}); }, //focusNode: _contentFocusNode, onChanged: (text) async { _searchText = text; }, placeholder: "请输入想要搜索的商品", placeholderStyle: TextStyle( color: Colors.grey.shade500, fontSize: 14, fontWeight: FontWeight.w300), decoration: BoxDecoration(color: Colors.white.withAlpha(0)), style: TextStyle( color: Colors.black, textBaseline: TextBaseline.ideographic), ), ) ], )); } List _tabItems() { return _secondCategoryList.map((item) { int index = _secondCategoryList.indexOf(item); return _tabItem(item, index); }).toList(); } _tabItem(SecondCategory secondCategory, int index) { Color textColor = index == _tabController.index ? getCurrentThemeColor() : Colors.black.withOpacity(0.9); return Tab( child: Container( alignment: Alignment.center, // color: Colors.white, color: AppThemes.themeDataGrey.appBarTheme.color, padding: EdgeInsets.only(left: 20, right: 20), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( secondCategory.name, style: TextStyle( fontWeight: FontWeight.w400, fontSize: 13 * 2.sp, color: textColor), ), ], ), ), ); } _filterToolBar(BuildContext context) { return FilterToolBar( controller: _filterController, height: rSize(40), fontSize: 13 * 2.sp, titles: _isJD ? [ FilterItemModel(type: FilterItemType.double, title: "价格",selectedList:_barBool), FilterItemModel(type: FilterItemType.double, title: "销量",selectedList:_barBool), // FilterItemModel(type: FilterItemType.normal, title: "特卖优先") ] : [ FilterItemModel(type: FilterItemType.normal, title: "综合",selectedList:_barBool), FilterItemModel(type: FilterItemType.double, title: "价格",selectedList:_barBool), FilterItemModel(type: FilterItemType.double, title: "销量",selectedList:_barBool), // FilterItemModel(type: FilterItemType.normal, title: "特卖优先") ], trialing: _displayIcon(), startWidget: _jdTypeWidget(), selectedColor: Theme.of(context).primaryColor, listener: (index, item) { print(index); if(!_isJD){ if ((index != 1 && index != 2) && _filterIndex == index) { return; } }else{ if ((index != 1 && index != 2&& index != 0) && _filterIndex == index) { return; } } // if (index != 1 && _filterIndex == index) { // return; // } _filterIndex = index; if (_isJD) { switch (index) { case 0: print(item.topSelected); if (item.topSelected) { _sortType = SortType.priceAsc; } else { _sortType = SortType.priceDesc; } break; case 1: print(item.topSelected); if (item.topSelected) { _sortType = SortType.salesAsc; } else { _sortType = SortType.salesDesc; } // _sortType = SortType.sales; break; // case 3: // print("特卖优先"); // break; } } else { switch (index) { case 0: _sortType = SortType.comprehensive; break; case 1: if (item.topSelected) { _sortType = SortType.priceAsc; } else { _sortType = SortType.priceDesc; } break; case 2: if (item.topSelected) { _sortType = SortType.salesAsc; } else { _sortType = SortType.salesDesc; } // _sortType = SortType.sales; break; // case 3: // print("特卖优先"); // break; } } // _presenter.fetchList(widget.category.id, 0, _sortType); // _presenter.fetchList(_category.id, 0, _sortType); _listViewController.stopRefresh(); _listViewController.requestRefresh(); }, ); } /// 切换排列按钮 Container _displayIcon() { return Container( margin: EdgeInsets.symmetric(horizontal: 8), child: GestureDetector( onTap: () { setState(() { _displayList = !_displayList; }); }, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( width: 1, height: 15, margin: EdgeInsets.only(right: 8), color: Colors.grey[700], ), Text( "排列", style: AppTextStyle.generate(13 * 2.sp, color: Colors.grey[700], fontWeight: FontWeight.w400), ), Padding( padding: const EdgeInsets.only(left: 2), child: Icon( _displayList ? AppIcons.icon_list_collection : AppIcons.icon_list_normal, color: Colors.grey[700], size: 20 * 2.sp, ), ), ], ), ), ); } Widget _jdTypeWidget() { return PopupMenuButton( offset: Offset(0, 10), color: Colors.white, child: Row( children: [ Text(_jdTypeText, style: TextStyle( fontSize: 14.rsp, color: Color(0xFFD5101A), )), Icon( Icons.arrow_drop_down, color: Color(0xFFD5101A), ), ], ), onSelected: (String value) { setState(() { _jdTypeText = value; if (value == '全部') { _jDType = 1; } else if (value == '京东自营') { _jDType = 2; } else if (value == '京东POP') { _jDType = 3; } print(value); setState(() {}); _listViewController.stopRefresh(); _listViewController.requestRefresh(); }); }, itemBuilder: (BuildContext context) => >[ PopupMenuItem( value: "全部", child: Text("全部", style: TextStyle( fontSize: 14.rsp, color: Color(0xFF333333), ))), PopupMenuItem( value: "京东自营", child: Text("京东自营", style: TextStyle( fontSize: 14.rsp, color: Color(0xFF333333), ))), PopupMenuItem( value: "京东POP", child: Text("京东POP", style: TextStyle( fontSize: 14.rsp, color: Color(0xFF333333), ))), ]); } _buildList(BuildContext context) { return MvpListView( delegate: this, noDataView: noDataView("没有找到商品!"), // padding: EdgeInsets.all(_displayList ? 0 : 10.0), controller: _listViewController, type: ListViewType.grid, refreshCallback: () { // _presenter.fetchList(widget.category.id, 0, _sortType); _presenter.fetchList(_category.id, 0, _sortType, null, JDType: _jDType,keyword: _searchText); setState(() { }); }, loadMoreCallback: (int page) { // _presenter.fetchList(widget.category.id, page, _sortType); _presenter.fetchList(_category.id, page, _sortType, null, JDType: _jDType,keyword: _searchText); setState(() { }); }, gridViewBuilder: () => _buildGridView(), ); } _buildGridView() { // return WaterfallFlow.builder( // itemBuilder: , // ); return WaterfallFlow.builder( padding: EdgeInsets.only(bottom: DeviceInfo.bottomBarHeight), physics: AlwaysScrollableScrollPhysics(), itemCount: _listViewController.getData().length, gridDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount( crossAxisCount: _displayList ? 1 : 2, crossAxisSpacing: _displayList ? 5 : 10, mainAxisSpacing: _displayList ? 5 : 10, ), itemBuilder: (context, index) { GoodsSimple goods = _listViewController.getData()[index]; // goods.inventory = 0; // goods.tags = ["新人特惠", "限时特卖", "限时特卖", "限时特卖", "限时特卖"]; return MaterialButton( padding: EdgeInsets.zero, onPressed: () { AppRouter.push(context, RouteName.COMMODITY_PAGE, arguments: CommodityDetailPage.setArguments(goods.id)); }, child: _displayList // ? BrandDetailListItem(goods: goods) ? GoodsItemWidget.normalGoodsItem( gifController: _gifController, onBrandClick: () { AppRouter.push(context, RouteName.BRANDGOODS_LIST_PAGE, arguments: BrandGoodsListPage.setArguments( goods.brandId, goods.brandName)); }, model: goods, buildCtx: context, type: _isJD?3:0, ) // ? NormalGoodsItem(model: goods, buildCtx: context,) : BrandDetailGridItem(goods: goods)); }); } @override MvpListViewPresenterI getPresenter() { return _presenter; } }