ProductList.dart

  1. import 'package:flutter/material.dart';
  2. import '../services/ScreenAdaper.dart';
  3. import '../config/Config.dart';
  4. import 'package:dio/dio.dart';
  5. import '../model/ProductModel.dart';
  6. import '../widget/LoadingWidget.dart';
  7.  
  8. class ProductListPage extends StatefulWidget {
  9. Map arguments;
  10. ProductListPage({Key key, this.arguments}) : super(key: key);
  11.  
  12. _ProductListPageState createState() => _ProductListPageState();
  13. }
  14.  
  15. class _ProductListPageState extends State<ProductListPage> {
  16. //通过事件打开侧边栏,需要全局声明一下:
  17. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  18. //配置下拉加载更多:
  19. ScrollController _scrollController = ScrollController();
  20. //分页:
  21. int _page = ;
  22. //每一页有多少条数据:
  23. int _pageSize = ;
  24. //分页:
  25. List _productList = [];
  26. //排序:
  27. String _sort = "";
  28. //解决重复请求的问题:
  29. bool flag = true;
  30.  
  31. //是否有数据:
  32. bool _hasMore = true;
  33. // 一级导航数据
  34. /*
  35. 价格升序:sort=price_1
  36. 价格降序:sort=price_-1
  37. 销量升序:sort=salecount_1
  38. 销量降序:sort=salecount_-1
  39. */
  40. List _subHeaderList = [
  41. {"id": , "title": "综合", "fileds": 'all', "sort": -},
  42. {"id": , "title": "销量", "fileds": 'salecount', "sort": -},
  43. {"id": , "title": "价格", "fileds": 'price', "sort": -},
  44. {"id": , "title": "筛选"},
  45. ];
  46. int _selectHeaderId = ;
  47.  
  48. //初始化的时候获取的生命周期函数:
  49. @override
  50. void initState() {
  51. super.initState();
  52. _getProductListData();
  53. //监听滚动条滚动事件:
  54. _scrollController.addListener(() {
  55. // _scrollController.position.pixels //获取滚动条滚动高度
  56. // _scrollController.position.maxScrollExtent //获取页面滚动高度:
  57. if (_scrollController.position.pixels >
  58. _scrollController.position.maxScrollExtent - ) {
  59. if (this.flag && this._hasMore) {
  60. _getProductListData();
  61. }
  62. }
  63. });
  64. }
  65.  
  66. //获取商品列表的数据:
  67. _getProductListData() async {
  68. setState(() {
  69. this.flag = false;
  70. });
  71. var api =
  72. '${Config.domain}api/plist?cid=${widget.arguments["cid"]}&page=${_page}&sort=${this._sort}&pageSize=${_pageSize}';
  73. var result = await Dio().get(api);
  74. var productList = ProductModel.fromJson(result.data);
  75. print(productList.result);
  76.  
  77. if (productList.result.length < this._pageSize) {
  78. setState(() {
  79. this._productList.addAll(productList.result);
  80. this._hasMore = false;
  81. this.flag = true;
  82. // this._productList = productList.result;
  83. });
  84. } else {
  85. setState(() {
  86. this._productList.addAll(productList.result);
  87. this._page++;
  88. this.flag = true;
  89. // this._productList = productList.result;
  90. });
  91. }
  92. }
  93.  
  94. //显示加载中的圈圈:
  95. Widget _showMore(index) {
  96. if (this._hasMore) {
  97. return (index == this._productList.length - )
  98. ? LoadingWidget()
  99. : Text('');
  100. } else {
  101. return (index == this._productList.length - )
  102. ? Text("---暂无其他数据了--")
  103. : Text('');
  104. }
  105. }
  106.  
  107. //商品列表:
  108. Widget _productListWidget() {
  109. if (this._productList.length > ) {
  110. return Container(
  111. padding: EdgeInsets.all(),
  112. margin: EdgeInsets.only(top: ScreenAdaper.height()),
  113. child: ListView.builder(
  114. controller: _scrollController,
  115. itemBuilder: (context, index) {
  116. //处理图片:
  117. String pic = this._productList[index].pic;
  118. pic = Config.domain + pic.replaceAll('\\', '/');
  119. //获得每一个元素:
  120. return Column(
  121. children: <Widget>[
  122. Row(
  123. children: <Widget>[
  124. Container(
  125. width: ScreenAdaper.width(),
  126. height: ScreenAdaper.height(),
  127. child: Image.network("${pic}", fit: BoxFit.cover),
  128. ),
  129. Expanded(
  130. flex: ,
  131. child: Container(
  132. height: ScreenAdaper.height(),
  133. margin: EdgeInsets.only(left: ),
  134. // color: Colors.red,
  135. child: Column(
  136. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  137. crossAxisAlignment: CrossAxisAlignment.start,
  138. children: <Widget>[
  139. Text(
  140. "${this._productList[index].title}",
  141. maxLines: ,
  142. overflow: TextOverflow.ellipsis,
  143. ),
  144. Row(
  145. children: <Widget>[
  146. Container(
  147. height: ScreenAdaper.height(),
  148. margin: EdgeInsets.only(right: ),
  149. padding: EdgeInsets.fromLTRB(, , , ),
  150. //注意:如果Container里面加上decoration属性,这个时候color属性必须放到BoxDecoration
  151. decoration: BoxDecoration(
  152. borderRadius: BorderRadius.circular(),
  153. // color:Color.fromRGBO(230, 230, 230, 0.9)
  154. ),
  155. child: Text('4G'),
  156. ),
  157. Container(
  158. height: ScreenAdaper.height(),
  159. margin: EdgeInsets.only(right: ),
  160. padding: EdgeInsets.fromLTRB(, , , ),
  161. //注意:如果Container里面加上decoration属性,这个时候color属性必须放到BoxDecoration
  162. decoration: BoxDecoration(
  163. borderRadius: BorderRadius.circular(),
  164. // color:Color.fromRGBO(230, 230, 230, 0.3)
  165. ),
  166. child: Text('16G'),
  167. )
  168. ],
  169. ),
  170. Text("¥ ${this._productList[index].price}",
  171. style:
  172. TextStyle(color: Colors.red, fontSize: ))
  173. ],
  174. ),
  175. ),
  176. )
  177. ],
  178. ),
  179. Divider(
  180. height: ,
  181. ),
  182. this._showMore(index)
  183. ],
  184. );
  185. },
  186. itemCount: this._productList.length,
  187. ),
  188. );
  189. } else {
  190. return LoadingWidget();
  191. }
  192. }
  193.  
  194. //导航改变的时候触发:
  195. _subHeaderChange(id) {
  196. if (id == ) {
  197. _scaffoldKey.currentState.openEndDrawer();
  198. }
  199. setState(() {
  200. this._selectHeaderId = id;
  201. this._sort =
  202. "${this._subHeaderList[id - 1]['fileds']}_${this._subHeaderList[id - 1]['sort']}";
  203.  
  204. //重置分页:
  205. this._page = ;
  206. //重置数据:
  207. this._productList = [];
  208.  
  209. this._subHeaderList[id - ]['sort'] =
  210. this._subHeaderList[id - ]['sort'] * -;
  211.  
  212. //回到顶部:
  213. _scrollController.jumpTo();
  214.  
  215. //重置_hasMore
  216. this._hasMore = true;
  217.  
  218. //重新请求数据:
  219. this._getProductListData();
  220. });
  221. }
  222.  
  223. //显示Header icon
  224. Widget _showIcon(id) {
  225. if (id == || id == ) {
  226. if (this._subHeaderList[id - ]['sort'] ==) {
  227. return Icon(Icons.arrow_drop_down);
  228. }
  229. return Icon(Icons.arrow_drop_up);
  230. }
  231. return Text('');
  232. }
  233.  
  234. //筛选导航:
  235. Widget _subHeaderWidget() {
  236. return Positioned(
  237. top: ,
  238. height: ScreenAdaper.height(),
  239. width: ScreenAdaper.width(),
  240. child: Container(
  241. height: ScreenAdaper.height(),
  242. width: ScreenAdaper.width(),
  243. // color: Colors.red,
  244. decoration: BoxDecoration(
  245. border: Border(
  246. bottom: BorderSide(
  247. width: , color: Color.fromRGBO(, , , 0.9)))),
  248. child: Row(
  249. children: this._subHeaderList.map((value) {
  250. return Expanded(
  251. flex: ,
  252. child: InkWell(
  253. child: Padding(
  254. padding: EdgeInsets.fromLTRB(
  255. , ScreenAdaper.height(), , ScreenAdaper.height()),
  256. child: Row(
  257. mainAxisAlignment: MainAxisAlignment.center,
  258. children: <Widget>[
  259. Text(
  260. "${value['title']}",
  261. textAlign: TextAlign.center,
  262. style: TextStyle(
  263. color: (this._selectHeaderId == value["id"])
  264. ? Colors.red
  265. : Colors.black),
  266. ),
  267. _showIcon(value['id'])
  268. ],
  269. ),
  270. ),
  271. onTap: () {
  272. _subHeaderChange(value["id"]);
  273. },
  274. ),
  275. );
  276. }).toList()),
  277. ),
  278. );
  279. }
  280.  
  281. @override
  282. Widget build(BuildContext context) {
  283. ScreenAdaper.init(context);
  284. return Scaffold(
  285. key: _scaffoldKey,
  286. appBar: AppBar(
  287. title: Text('商品列表'),
  288. actions: <Widget>[Text('')],
  289. ),
  290. endDrawer: Drawer(
  291. child: Container(
  292. child: Text('实现筛选功能'),
  293. ),
  294. ),
  295. // body: Text("${widget.arguments}"),
  296. body: Stack(
  297. children: <Widget>[_productListWidget(), _subHeaderWidget()],
  298. ),
  299. );
  300. }
  301. }

13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多的更多相关文章

  1. 12 Flutter仿京东商城项目 商品列表页面请求数据、封装Loading Widget、上拉分页加载更多

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  2. 11 Flutter仿京东商城项目 商品列表页面二级筛选导航布局

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  3. 18 Flutter仿京东商城项目 商品详情顶部tab切换 顶部下拉菜单 底部浮动导航

    ProductContent.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; ...

  4. 19 Flutter仿京东商城项目 商品详情 底部浮动导航布局 商品页面布局

    效果: widget/JdButton.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.da ...

  5. 21 Flutter仿京东商城项目 商品详情 请求接口渲染数据 商品属性数据渲染

    加群452892873 下载对应21可文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展.   cupertino_icons: ^0.1.2   flutter ...

  6. 20 Flutter仿京东商城项目 商品详情 底部弹出筛选属性 以及筛选属性页面布局

    ProductContentFirst.dart import 'package:flutter/material.dart'; import '../../widget/JdButton.dart' ...

  7. 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)

    Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...

  8. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  9. 10 Flutter仿京东商城项目 商品分类跳转到商品列表传值 商品列表页面布局

    pages下面新建: ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper ...

随机推荐

  1. dbm和发射功率得对照表

    原文链接:https://blog.csdn.net/nicholas_dlut/article/details/80950163dBm mW 下面是dbm和发射功率得对照表. 基本上市面上所有的无线 ...

  2. Vs2017 FrameWork EF Mysql Mvc 三层整合1

    1  运行环境   vs2017   Net FromWork 4.6.2  手动版 没有 ado.net 实体数据模型 2 NuGet  MySql.Data.Entity 6.10.9, MySq ...

  3. nginx 缓存区太小导致后台Connection reset by peer 报错

    问题概述:图片bit 64生成数据流太大,导致小程序分享弹窗的二维码图片生成失败 后台报错: 排查: Client------>nginx------->h5------>nginx ...

  4. webpac4k运行webpack .\src\main.js .\dist\bundle.js打包出错

    打包的命令格式:webpack 要打包的文件的路径  打包好的输出文件的路径 运行webpack .\src\main.js .\dist\bundle.js 提示错误,错误信息如下: WARNING ...

  5. GDI+图像编程

    一.Graphics GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘 ...

  6. 可嵌入的脚本引擎 Jx9

    Jx9是一个可嵌入的脚本引擎,基于JSON实现了图灵完备(Turing complete)的编程语言. Jx9 是那些需要流行和高效率脚本支持应用程序(比如:游戏.数据库系统,文本编辑器,网络应用程序 ...

  7. Python3之使用Crypto

    pip3 install pycryptodome 快速方式:pip3 install -i https://pypi.douban.com/simple pycryptodome PyCrypto ...

  8. SQL的左连接与右链接

    1.准备工作 Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...

  9. 21、自动装配-@Resource&@Inject

    21.自动装配-@Resource&@Inject Spring 还支持使用@Resource(JSR250)和@Inject(JSR330)[Java规范的注解] AutowiredAnno ...

  10. Oracle 后台进程(六)PMON进程

    一.PMON简介 二.PMON的工作内容如下: 1.监控后台进程运行状况 2.如果某些进程异常中断,PMON去释放会话资源以及占用的锁LOCK 3.更新事务表的标志以及清除事务XID的标记 4.清除异 ...