video_list.dart 7.8 KB

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