search_brand.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:liftmanager/internal/bbs/model/brand_model.dart';
  6. import 'package:liftmanager/internal/means/means_router.dart';
  7. import 'package:liftmanager/internal/search/presenter/base_list_provider.dart';
  8. import 'package:liftmanager/internal/search/presenter/brand_search_presenter.dart';
  9. import 'package:liftmanager/mvp/base_page_state.dart';
  10. import 'package:liftmanager/res/resources.dart';
  11. import 'package:liftmanager/routers/fluro_navigator.dart';
  12. import 'package:liftmanager/utils/toast.dart';
  13. import 'package:liftmanager/widgets/load_image.dart';
  14. import 'package:liftmanager/widgets/my_refresh_list.dart';
  15. import 'package:liftmanager/widgets/search_app_bar.dart';
  16. import 'package:liftmanager/widgets/state_layout.dart';
  17. import 'package:provider/provider.dart';
  18. class SearchBrand extends StatefulWidget {
  19. @override
  20. SearchBrandState createState() => SearchBrandState();
  21. }
  22. class SearchBrandState
  23. extends BasePageState<SearchBrand, BrandSearchPresenterSeconds> {
  24. BaseListProvider<Records> provider = BaseListProvider<Records>();
  25. int _page = 1;
  26. String searchWord = '';
  27. ScrollController _scrollController = new ScrollController();
  28. @override
  29. void initState() {
  30. provider.setStateTypeNotNotify(StateType.empty);
  31. super.initState();
  32. }
  33. @override
  34. void dispose() {
  35. _scrollController.dispose();
  36. super.dispose();
  37. }
  38. @override
  39. Widget build(BuildContext context) {
  40. double width = MediaQuery.of(context).size.width;
  41. return ChangeNotifierProvider<BaseListProvider<Records>>(
  42. create: (_) => provider,
  43. child: Scaffold(
  44. appBar: SearchAppBar(
  45. hintText: "请输入需要搜索的内容",
  46. onPressed: (text) {
  47. if (text.isEmpty) {
  48. toasts("搜索关键字不能为空!");
  49. return;
  50. }
  51. FocusScope.of(context).unfocus();
  52. searchWord = text;
  53. _onRefresh();
  54. },
  55. ),
  56. body: Container(
  57. child: Column(
  58. children: <Widget>[
  59. Expanded(
  60. flex: 1,
  61. child: Consumer<BaseListProvider<Records>>(
  62. builder: (_, provider, __) {
  63. return MyListView(
  64. key: Key('brand_list'),
  65. itemCount: provider.list.length,
  66. stateType: provider.stateType,
  67. onRefresh: _onRefresh,
  68. loadMore: _loadMore,
  69. hasMore: provider.hasMore,
  70. itemBuilder: (_, index) {
  71. return GestureDetector(
  72. child: Container(
  73. padding: EdgeInsets.only(
  74. left: ScreenUtil().setWidth(15),
  75. right: ScreenUtil().setWidth(15),
  76. top: ScreenUtil().setHeight(10),
  77. bottom: ScreenUtil().setHeight(10),
  78. ),
  79. decoration: BoxDecoration(
  80. border: Border(
  81. bottom:
  82. BorderSide(width: 0.5, color: Colours.line),
  83. ),
  84. ),
  85. child: Column(children: <Widget>[
  86. Container(
  87. padding: EdgeInsets.only(
  88. bottom: ScreenUtil().setHeight(5)),
  89. child: Row(
  90. mainAxisAlignment:
  91. MainAxisAlignment.spaceBetween,
  92. children: <Widget>[
  93. Row(
  94. crossAxisAlignment:
  95. CrossAxisAlignment.center,
  96. children: <Widget>[
  97. Container(
  98. padding: EdgeInsets.only(
  99. right: ScreenUtil().setWidth(10)),
  100. child: ClipRRect(
  101. borderRadius: BorderRadius.circular(
  102. ScreenUtil().setWidth(18)),
  103. child: Container(
  104. width: ScreenUtil().setWidth(36),
  105. height: ScreenUtil().setWidth(36),
  106. color: Color(0xffFAF7FA),
  107. padding: EdgeInsets.all(2),
  108. child: LoadNetworkImage(
  109. provider.list[index].logo,
  110. fit: BoxFit.cover,
  111. width:
  112. ScreenUtil().setWidth(100),
  113. height:
  114. ScreenUtil().setWidth(100),
  115. ),
  116. ),
  117. ),
  118. ),
  119. Container(
  120. child: Text(
  121. provider.list[index].name ?? '',
  122. textAlign: TextAlign.left,
  123. style: TextStyle(
  124. fontSize: ScreenUtil().setSp(14),
  125. color: Color(0xff333333),
  126. ),
  127. ),
  128. ),
  129. ],
  130. ),
  131. Container(
  132. child: Icon(
  133. Icons.keyboard_arrow_right,
  134. size: 26.0,
  135. color: Color(0xffdddddd),
  136. ),
  137. )
  138. ],
  139. ),
  140. ),
  141. ]),
  142. ),
  143. onTap: () {
  144. NavigatorUtils.push(context,
  145. "${MeansRouter.brandDetail}?id=${provider.list[index].id.toString()}");
  146. },
  147. );
  148. },
  149. );
  150. },
  151. ),
  152. )
  153. ],
  154. ),
  155. ),
  156. ),
  157. );
  158. }
  159. Future _onRefresh() async {
  160. _page = 1;
  161. await presenter.getBrandList(_page, searchWord);
  162. }
  163. Future _loadMore() async {
  164. _page++;
  165. await presenter.getBrandList(_page, searchWord);
  166. }
  167. @override
  168. BrandSearchPresenterSeconds createPresenter() {
  169. return BrandSearchPresenterSeconds();
  170. }
  171. }