means_list.dart 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:liftmanager/internal/bbs/model/means_model.dart';
  7. import 'package:liftmanager/internal/means/page/means_pdf.dart';
  8. import 'package:liftmanager/internal/means/presenter/means_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/res/iconfont.dart';
  12. import 'package:liftmanager/res/resources.dart';
  13. import 'package:liftmanager/utils/toast.dart';
  14. import 'package:liftmanager/utils/utils.dart';
  15. import 'package:liftmanager/widgets/app_search_bar.dart';
  16. import 'package:liftmanager/widgets/my_refresh_list.dart';
  17. import 'package:liftmanager/widgets/preview_images.dart';
  18. import 'package:liftmanager/widgets/state_layout.dart';
  19. import 'package:path_provider/path_provider.dart';
  20. import 'package:provider/provider.dart';
  21. class MeansList extends StatefulWidget {
  22. MeansList(this.catagoryId, this.dataTable, this.brandId);
  23. final String catagoryId;
  24. final String dataTable;
  25. final String brandId;
  26. @override
  27. MeansListState createState() => MeansListState();
  28. }
  29. class MeansListState
  30. extends BasePageState<MeansList, MeansListPresenterSeconds> {
  31. BaseListProvider<MeansDetailModel> provider =
  32. BaseListProvider<MeansDetailModel>();
  33. int _page = 1;
  34. ScrollController _scrollController = new ScrollController();
  35. String pathPDF = "";
  36. String searchWord = '';
  37. @override
  38. void initState() {
  39. provider.setStateTypeNotNotify(StateType.loading);
  40. super.initState();
  41. _onRefresh();
  42. }
  43. @override
  44. void dispose() {
  45. _scrollController.dispose();
  46. super.dispose();
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. double width = MediaQuery.of(context).size.width;
  51. return ChangeNotifierProvider<BaseListProvider<MeansDetailModel>>(
  52. create: (_) => provider,
  53. child: Scaffold(
  54. appBar: SearchAppBar2(
  55. onPressed: (text) {
  56. print(text);
  57. searchWord = text;
  58. _onRefresh();
  59. },
  60. ),
  61. body: Container(
  62. child: Column(
  63. children: <Widget>[
  64. Expanded(
  65. flex: 1,
  66. child: Consumer<BaseListProvider<MeansDetailModel>>(
  67. builder: (_, provider, __) {
  68. return MyListView(
  69. key: Key('means_list'),
  70. itemCount: provider.list.length,
  71. stateType: provider.stateType,
  72. onRefresh: _onRefresh,
  73. loadMore: _loadMore,
  74. hasMore: provider.hasMore,
  75. itemBuilder: (_, index) {
  76. return GestureDetector(
  77. child: Container(
  78. padding: EdgeInsets.only(
  79. left: ScreenUtil().setWidth(15),
  80. right: ScreenUtil().setWidth(15),
  81. top: ScreenUtil().setHeight(10),
  82. bottom: ScreenUtil().setHeight(10),
  83. ),
  84. decoration: BoxDecoration(
  85. border: Border(
  86. bottom:
  87. BorderSide(width: 0.5, color: Colours.line),
  88. ),
  89. ),
  90. child: Column(
  91. children: <Widget>[
  92. Container(
  93. padding: EdgeInsets.only(
  94. bottom: ScreenUtil().setHeight(5)),
  95. child: Row(
  96. mainAxisAlignment:
  97. MainAxisAlignment.spaceBetween,
  98. children: <Widget>[
  99. Container(
  100. padding: EdgeInsets.only(
  101. right: ScreenUtil().setWidth(10)),
  102. child: ClipRRect(
  103. borderRadius: BorderRadius.circular(
  104. ScreenUtil().setWidth(18)),
  105. child: Container(
  106. width: ScreenUtil().setWidth(36),
  107. height: ScreenUtil().setWidth(36),
  108. color: Color(0xffF7FAFF),
  109. // padding: EdgeInsets.only(right:10),
  110. child: Icon(
  111. Iconfont.wenjian,
  112. size: 24.0,
  113. color: Color(0xff5589FF),
  114. ),
  115. ),
  116. ),
  117. ),
  118. Expanded(
  119. child: Text(
  120. provider.list[index].name ?? '',
  121. textAlign: TextAlign.left,
  122. style: TextStyle(
  123. fontSize: ScreenUtil().setSp(14),
  124. color: Color(0xff555A64),
  125. ),
  126. ),
  127. ),
  128. ],
  129. ),
  130. ),
  131. ],
  132. ),
  133. ),
  134. onTap: () {
  135. var fileUrl = provider.list[index].url;
  136. if (fileUrl != null && fileUrl != '') {
  137. fileUrl =
  138. Utils.getImagePath(provider.list[index].url);
  139. print(fileUrl);
  140. if (Utils.getFileType(fileUrl) == 'image') {
  141. Navigator.of(context).push(
  142. new FadeRoute(
  143. page: PhotoViewGalleryScreen(
  144. images: [fileUrl], //传入图片list
  145. index: index, //传入当前点击的图片的index
  146. // heroTag: img,//传入当前点击的图片的hero tag (可选)
  147. ),
  148. ),
  149. );
  150. } else if (Utils.getFileType(fileUrl) == 'pdf') {
  151. createFileOfPdfUrl(fileUrl).then(
  152. (f) {
  153. setState(
  154. () {
  155. pathPDF = f.path;
  156. print(f.path);
  157. print("123456789-----");
  158. Navigator.push(
  159. context,
  160. MaterialPageRoute(
  161. builder: (context) => PDFScreen(
  162. f.path,
  163. fileUrl,
  164. provider.list[index].id
  165. .toString()),
  166. ),
  167. );
  168. },
  169. );
  170. },
  171. );
  172. }
  173. } else {
  174. toasts("暂无文件");
  175. }
  176. },
  177. );
  178. },
  179. );
  180. },
  181. ),
  182. )
  183. ],
  184. ),
  185. ),
  186. ),
  187. );
  188. }
  189. Future _onRefresh() async {
  190. _page = 1;
  191. await presenter.getMeansList(
  192. _page, widget.dataTable, widget.catagoryId, widget.brandId,
  193. searchWord: searchWord);
  194. }
  195. Future _loadMore() async {
  196. _page++;
  197. await presenter.getMeansList(
  198. _page, widget.dataTable, widget.catagoryId, widget.brandId,
  199. searchWord: searchWord);
  200. }
  201. Future<File> createFileOfPdfUrl(url) async {
  202. final filename = url.substring(url.lastIndexOf("/") + 1);
  203. var request = await HttpClient().getUrl(Uri.parse(url));
  204. var response = await request.close();
  205. var bytes = await consolidateHttpClientResponseBytes(response);
  206. String dir = (await getApplicationDocumentsDirectory()).path;
  207. File file = new File('$dir/$filename');
  208. await file.writeAsBytes(bytes);
  209. return file;
  210. }
  211. @override
  212. MeansListPresenterSeconds createPresenter() {
  213. return MeansListPresenterSeconds();
  214. }
  215. }
  216. class FadeRoute extends PageRouteBuilder {
  217. final Widget page;
  218. FadeRoute({this.page})
  219. : super(
  220. pageBuilder: (
  221. BuildContext context,
  222. Animation<double> animation,
  223. Animation<double> secondaryAnimation,
  224. ) =>
  225. page,
  226. transitionsBuilder: (
  227. BuildContext context,
  228. Animation<double> animation,
  229. Animation<double> secondaryAnimation,
  230. Widget child,
  231. ) =>
  232. FadeTransition(
  233. opacity: animation,
  234. child: child,
  235. ),
  236. );
  237. }