video_list.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. import 'package:date_format/date_format.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:flutter_spinkit/flutter_spinkit.dart';
  5. import 'package:liftmanager/internal/bbs/bbs_router.dart';
  6. import 'package:liftmanager/internal/bbs/model/brand_model_type.dart';
  7. import 'package:liftmanager/internal/bbs/model/mix_model.dart';
  8. import 'package:liftmanager/internal/bbs/presenter/video_list_presenter.dart';
  9. import 'package:liftmanager/internal/search/presenter/base_list_provider.dart';
  10. import 'package:liftmanager/mvp/base_page_state.dart';
  11. import 'package:liftmanager/net/api_service.dart';
  12. import 'package:liftmanager/res/resources.dart';
  13. import 'package:liftmanager/routers/fluro_navigator.dart';
  14. import 'package:liftmanager/utils/theme_utils.dart';
  15. import 'package:liftmanager/utils/toast.dart';
  16. import 'package:liftmanager/widgets/app_search_bar.dart';
  17. import 'package:liftmanager/widgets/bbs_content.dart';
  18. import 'package:liftmanager/widgets/my_refresh_list.dart';
  19. import 'package:liftmanager/widgets/state_layout.dart';
  20. import 'package:provider/provider.dart';
  21. import '../../brand_page.dart';
  22. class VideoList extends StatefulWidget {
  23. @override
  24. VideoListState createState() => VideoListState();
  25. }
  26. class VideoListState
  27. extends BasePageState<VideoList, VideoListPresenterSeconds> {
  28. BaseListProvider<Records> provider = BaseListProvider<Records>();
  29. int _page = 1;
  30. int selectedBrandId;
  31. bool showAllBrands = false;
  32. String checkTypeName;
  33. String checkType;
  34. String searchWord;
  35. List<dynamic> typeList;
  36. List<dynamic> brandList;
  37. List<dynamic> hotBrandList;
  38. int activeFilterIndex = 0;
  39. Future getBrandList() async {
  40. await NewApiService().getBrandListType(null, onSuccess: (res) {
  41. if (res != null) {
  42. BrandModelType bm = res[0];
  43. brandList = res;
  44. hotBrandList = bm?.listBrand;
  45. typeList = brandList;
  46. setState(() {});
  47. }
  48. }, onError: (code, msg) {
  49. toasts(msg);
  50. });
  51. }
  52. @override
  53. void initState() {
  54. provider.setStateTypeNotNotify(StateType.loading);
  55. super.initState();
  56. _onRefresh();
  57. getBrandList();
  58. }
  59. @override
  60. void dispose() {
  61. super.dispose();
  62. }
  63. @override
  64. Widget build(BuildContext context) {
  65. double width = MediaQuery.of(context).size.width;
  66. double height = MediaQuery.of(context).size.height;
  67. return ChangeNotifierProvider<BaseListProvider<Records>>(
  68. create: (_) => provider,
  69. child: Scaffold(
  70. appBar: SearchAppBar2(
  71. searchWidth: width * 0.7,
  72. onPressed: (text) {
  73. searchWord = text;
  74. _onRefresh();
  75. },
  76. actions: <Widget>[
  77. FlatButton(
  78. child: Text(
  79. "上传",
  80. style: TextStyle(color: Color(0xff333333), fontSize: 15),
  81. ),
  82. textColor: Colours.text,
  83. highlightColor: Colors.transparent,
  84. onPressed: () {
  85. NavigatorUtils.push(context, BbsRouter.videoUpload);
  86. },
  87. )
  88. ],
  89. ),
  90. body: Container(
  91. child: Stack(
  92. children: <Widget>[
  93. Column(
  94. children: <Widget>[
  95. Container(
  96. width: width,
  97. height: 50,
  98. padding: EdgeInsets.symmetric(horizontal: 10),
  99. child: Row(
  100. children: <Widget>[
  101. Expanded(
  102. child: CustomFilterHeader(
  103. activeIndex: activeFilterIndex,
  104. filterNameList: hotBrandList
  105. ?.map<String>((e) => e.name)
  106. ?.toList(),
  107. onTap: (index) {
  108. setState(() {
  109. activeFilterIndex = index;
  110. showAllBrands = false;
  111. });
  112. if (activeFilterIndex == 0) {
  113. selectedBrandId = null;
  114. } else {
  115. selectedBrandId = hotBrandList[index - 1].id;
  116. }
  117. _onRefresh();
  118. },
  119. ),
  120. ),
  121. GestureDetector(
  122. onTap: () {
  123. typeList = [];
  124. getBrandList();
  125. setState(() {
  126. showAllBrands = !showAllBrands;
  127. });
  128. },
  129. child: Container(
  130. padding: EdgeInsets.only(top: 3),
  131. child: Icon(
  132. showAllBrands
  133. ? Icons.keyboard_arrow_up
  134. : Icons.keyboard_arrow_down,
  135. size: 26.0,
  136. ),
  137. ),
  138. ),
  139. ],
  140. ),
  141. ),
  142. Divider(
  143. height: 5,
  144. thickness: 5,
  145. color: Color(0xffF9F9F9),
  146. ),
  147. Expanded(
  148. flex: 1,
  149. child: Consumer<BaseListProvider<Records>>(
  150. builder: (_, provider, __) {
  151. return MyListView(
  152. key: Key('video_list'),
  153. itemCount: provider.list.length,
  154. stateType: provider.stateType,
  155. onRefresh: _onRefresh,
  156. pageSize: 10,
  157. loadMore: _loadMore,
  158. hasMore: provider.hasMore,
  159. padding: EdgeInsets.symmetric(horizontal: 10),
  160. itemBuilder: (_, index) {
  161. return VideoCell(provider.list[index]);
  162. },
  163. );
  164. }))
  165. ],
  166. ),
  167. if (showAllBrands)
  168. Positioned.fill(
  169. top: 50,
  170. left: 0,
  171. // width: width,
  172. // height: height - 50,
  173. child: Container(
  174. color: Colors.white,
  175. child: BrandSelectionPanel(
  176. brandList: brandList,
  177. onTapBrand: (records) {
  178. setState(() {
  179. showAllBrands = false;
  180. selectedBrandId = records.id;
  181. activeFilterIndex = null;
  182. _onRefresh();
  183. });
  184. },
  185. ),
  186. ),
  187. ),
  188. ],
  189. ),
  190. ),
  191. ),
  192. );
  193. }
  194. Widget loadCircle() {
  195. return Container(
  196. padding: EdgeInsets.only(top: 10, bottom: 10),
  197. color: ThemeUtils.getTabsBg(context),
  198. child: Center(
  199. child: SpinKitFadingCircle(
  200. color: Colors.blueAccent,
  201. size: 30.0,
  202. ),
  203. ),
  204. );
  205. }
  206. Future _onRefresh() async {
  207. _page = 1;
  208. await presenter.getVideoList(_page, selectedBrandId, searchWord);
  209. }
  210. Future _loadMore() async {
  211. _page++;
  212. await presenter.getVideoList(_page, selectedBrandId, searchWord);
  213. }
  214. @override
  215. VideoListPresenterSeconds createPresenter() {
  216. return VideoListPresenterSeconds();
  217. }
  218. }