13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多
ProductList.dart
- import 'package:flutter/material.dart';
- import '../services/ScreenAdaper.dart';
- import '../config/Config.dart';
- import 'package:dio/dio.dart';
- import '../model/ProductModel.dart';
- import '../widget/LoadingWidget.dart';
- class ProductListPage extends StatefulWidget {
- Map arguments;
- ProductListPage({Key key, this.arguments}) : super(key: key);
- _ProductListPageState createState() => _ProductListPageState();
- }
- class _ProductListPageState extends State<ProductListPage> {
- //通过事件打开侧边栏,需要全局声明一下:
- final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
- //配置下拉加载更多:
- ScrollController _scrollController = ScrollController();
- //分页:
- int _page = ;
- //每一页有多少条数据:
- int _pageSize = ;
- //分页:
- List _productList = [];
- //排序:
- String _sort = "";
- //解决重复请求的问题:
- bool flag = true;
- //是否有数据:
- bool _hasMore = true;
- // 一级导航数据
- /*
- 价格升序:sort=price_1
- 价格降序:sort=price_-1
- 销量升序:sort=salecount_1
- 销量降序:sort=salecount_-1
- */
- List _subHeaderList = [
- {"id": , "title": "综合", "fileds": 'all', "sort": -},
- {"id": , "title": "销量", "fileds": 'salecount', "sort": -},
- {"id": , "title": "价格", "fileds": 'price', "sort": -},
- {"id": , "title": "筛选"},
- ];
- int _selectHeaderId = ;
- //初始化的时候获取的生命周期函数:
- @override
- void initState() {
- super.initState();
- _getProductListData();
- //监听滚动条滚动事件:
- _scrollController.addListener(() {
- // _scrollController.position.pixels //获取滚动条滚动高度
- // _scrollController.position.maxScrollExtent //获取页面滚动高度:
- if (_scrollController.position.pixels >
- _scrollController.position.maxScrollExtent - ) {
- if (this.flag && this._hasMore) {
- _getProductListData();
- }
- }
- });
- }
- //获取商品列表的数据:
- _getProductListData() async {
- setState(() {
- this.flag = false;
- });
- var api =
- '${Config.domain}api/plist?cid=${widget.arguments["cid"]}&page=${_page}&sort=${this._sort}&pageSize=${_pageSize}';
- var result = await Dio().get(api);
- var productList = ProductModel.fromJson(result.data);
- print(productList.result);
- if (productList.result.length < this._pageSize) {
- setState(() {
- this._productList.addAll(productList.result);
- this._hasMore = false;
- this.flag = true;
- // this._productList = productList.result;
- });
- } else {
- setState(() {
- this._productList.addAll(productList.result);
- this._page++;
- this.flag = true;
- // this._productList = productList.result;
- });
- }
- }
- //显示加载中的圈圈:
- Widget _showMore(index) {
- if (this._hasMore) {
- return (index == this._productList.length - )
- ? LoadingWidget()
- : Text('');
- } else {
- return (index == this._productList.length - )
- ? Text("---暂无其他数据了--")
- : Text('');
- }
- }
- //商品列表:
- Widget _productListWidget() {
- if (this._productList.length > ) {
- return Container(
- padding: EdgeInsets.all(),
- margin: EdgeInsets.only(top: ScreenAdaper.height()),
- child: ListView.builder(
- controller: _scrollController,
- itemBuilder: (context, index) {
- //处理图片:
- String pic = this._productList[index].pic;
- pic = Config.domain + pic.replaceAll('\\', '/');
- //获得每一个元素:
- return Column(
- children: <Widget>[
- Row(
- children: <Widget>[
- Container(
- width: ScreenAdaper.width(),
- height: ScreenAdaper.height(),
- child: Image.network("${pic}", fit: BoxFit.cover),
- ),
- Expanded(
- flex: ,
- child: Container(
- height: ScreenAdaper.height(),
- margin: EdgeInsets.only(left: ),
- // color: Colors.red,
- child: Column(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: <Widget>[
- Text(
- "${this._productList[index].title}",
- maxLines: ,
- overflow: TextOverflow.ellipsis,
- ),
- Row(
- children: <Widget>[
- Container(
- height: ScreenAdaper.height(),
- margin: EdgeInsets.only(right: ),
- padding: EdgeInsets.fromLTRB(, , , ),
- //注意:如果Container里面加上decoration属性,这个时候color属性必须放到BoxDecoration
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(),
- // color:Color.fromRGBO(230, 230, 230, 0.9)
- ),
- child: Text('4G'),
- ),
- Container(
- height: ScreenAdaper.height(),
- margin: EdgeInsets.only(right: ),
- padding: EdgeInsets.fromLTRB(, , , ),
- //注意:如果Container里面加上decoration属性,这个时候color属性必须放到BoxDecoration
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(),
- // color:Color.fromRGBO(230, 230, 230, 0.3)
- ),
- child: Text('16G'),
- )
- ],
- ),
- Text("¥ ${this._productList[index].price}",
- style:
- TextStyle(color: Colors.red, fontSize: ))
- ],
- ),
- ),
- )
- ],
- ),
- Divider(
- height: ,
- ),
- this._showMore(index)
- ],
- );
- },
- itemCount: this._productList.length,
- ),
- );
- } else {
- return LoadingWidget();
- }
- }
- //导航改变的时候触发:
- _subHeaderChange(id) {
- if (id == ) {
- _scaffoldKey.currentState.openEndDrawer();
- }
- setState(() {
- this._selectHeaderId = id;
- this._sort =
- "${this._subHeaderList[id - 1]['fileds']}_${this._subHeaderList[id - 1]['sort']}";
- //重置分页:
- this._page = ;
- //重置数据:
- this._productList = [];
- this._subHeaderList[id - ]['sort'] =
- this._subHeaderList[id - ]['sort'] * -;
- //回到顶部:
- _scrollController.jumpTo();
- //重置_hasMore
- this._hasMore = true;
- //重新请求数据:
- this._getProductListData();
- });
- }
- //显示Header icon
- Widget _showIcon(id) {
- if (id == || id == ) {
- if (this._subHeaderList[id - ]['sort'] ==) {
- return Icon(Icons.arrow_drop_down);
- }
- return Icon(Icons.arrow_drop_up);
- }
- return Text('');
- }
- //筛选导航:
- Widget _subHeaderWidget() {
- return Positioned(
- top: ,
- height: ScreenAdaper.height(),
- width: ScreenAdaper.width(),
- child: Container(
- height: ScreenAdaper.height(),
- width: ScreenAdaper.width(),
- // color: Colors.red,
- decoration: BoxDecoration(
- border: Border(
- bottom: BorderSide(
- width: , color: Color.fromRGBO(, , , 0.9)))),
- child: Row(
- children: this._subHeaderList.map((value) {
- return Expanded(
- flex: ,
- child: InkWell(
- child: Padding(
- padding: EdgeInsets.fromLTRB(
- , ScreenAdaper.height(), , ScreenAdaper.height()),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- Text(
- "${value['title']}",
- textAlign: TextAlign.center,
- style: TextStyle(
- color: (this._selectHeaderId == value["id"])
- ? Colors.red
- : Colors.black),
- ),
- _showIcon(value['id'])
- ],
- ),
- ),
- onTap: () {
- _subHeaderChange(value["id"]);
- },
- ),
- );
- }).toList()),
- ),
- );
- }
- @override
- Widget build(BuildContext context) {
- ScreenAdaper.init(context);
- return Scaffold(
- key: _scaffoldKey,
- appBar: AppBar(
- title: Text('商品列表'),
- actions: <Widget>[Text('')],
- ),
- endDrawer: Drawer(
- child: Container(
- child: Text('实现筛选功能'),
- ),
- ),
- // body: Text("${widget.arguments}"),
- body: Stack(
- children: <Widget>[_productListWidget(), _subHeaderWidget()],
- ),
- );
- }
- }
13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多的更多相关文章
- 12 Flutter仿京东商城项目 商品列表页面请求数据、封装Loading Widget、上拉分页加载更多
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- 11 Flutter仿京东商城项目 商品列表页面二级筛选导航布局
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- 18 Flutter仿京东商城项目 商品详情顶部tab切换 顶部下拉菜单 底部浮动导航
ProductContent.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; ...
- 19 Flutter仿京东商城项目 商品详情 底部浮动导航布局 商品页面布局
效果: widget/JdButton.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.da ...
- 21 Flutter仿京东商城项目 商品详情 请求接口渲染数据 商品属性数据渲染
加群452892873 下载对应21可文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^0.1.2 flutter ...
- 20 Flutter仿京东商城项目 商品详情 底部弹出筛选属性 以及筛选属性页面布局
ProductContentFirst.dart import 'package:flutter/material.dart'; import '../../widget/JdButton.dart' ...
- 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)
Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...
- 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- 10 Flutter仿京东商城项目 商品分类跳转到商品列表传值 商品列表页面布局
pages下面新建: ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper ...
随机推荐
- dbm和发射功率得对照表
原文链接:https://blog.csdn.net/nicholas_dlut/article/details/80950163dBm mW 下面是dbm和发射功率得对照表. 基本上市面上所有的无线 ...
- Vs2017 FrameWork EF Mysql Mvc 三层整合1
1 运行环境 vs2017 Net FromWork 4.6.2 手动版 没有 ado.net 实体数据模型 2 NuGet MySql.Data.Entity 6.10.9, MySq ...
- nginx 缓存区太小导致后台Connection reset by peer 报错
问题概述:图片bit 64生成数据流太大,导致小程序分享弹窗的二维码图片生成失败 后台报错: 排查: Client------>nginx------->h5------>nginx ...
- webpac4k运行webpack .\src\main.js .\dist\bundle.js打包出错
打包的命令格式:webpack 要打包的文件的路径 打包好的输出文件的路径 运行webpack .\src\main.js .\dist\bundle.js 提示错误,错误信息如下: WARNING ...
- GDI+图像编程
一.Graphics GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘 ...
- 可嵌入的脚本引擎 Jx9
Jx9是一个可嵌入的脚本引擎,基于JSON实现了图灵完备(Turing complete)的编程语言. Jx9 是那些需要流行和高效率脚本支持应用程序(比如:游戏.数据库系统,文本编辑器,网络应用程序 ...
- Python3之使用Crypto
pip3 install pycryptodome 快速方式:pip3 install -i https://pypi.douban.com/simple pycryptodome PyCrypto ...
- SQL的左连接与右链接
1.准备工作 Oracle 外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...
- 21、自动装配-@Resource&@Inject
21.自动装配-@Resource&@Inject Spring 还支持使用@Resource(JSR250)和@Inject(JSR330)[Java规范的注解] AutowiredAnno ...
- Oracle 后台进程(六)PMON进程
一.PMON简介 二.PMON的工作内容如下: 1.监控后台进程运行状况 2.如果某些进程异常中断,PMON去释放会话资源以及占用的锁LOCK 3.更新事务表的标志以及清除事务XID的标记 4.清除异 ...