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仿京东商城项目 商品列表筛选以及上拉分页加载更多的更多相关文章

  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. linux 基础9-账号与身份管理

    1. linux的账号与群组 1.1 账户名称:/etc/passwd: head -n 5 /etc/password #取前5行 账号名称,对应UID 密码,早期是在这里,后来转到了/etc/sh ...

  2. ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问

    报错:ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问.: 'E:\\Anoconda\\ ...

  3. 【转】关于 Goroutine Channel Select 的用法和理解

    原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...

  4. 《流畅的Python》Data Structures--第7章 colsure and decorator

    Function Decorators and Closures 装饰器是用于增强函数的行为,理解它,就必须先理解闭包. Python3引入关键字nonlocal,如果要理解闭包,就必须了解它的所有方 ...

  5. Vue.js项目中使用 Ajax 和 FormDate 对象上传文件

    let param = new FormData(); param.append("paths", this.ruleForm.uploadPath); param.append( ...

  6. python_面向对象——类之间的依赖关系

    class Dog: def __init__(self,name,age,master): self.name = name self.age = age self.master = master ...

  7. Jquery选择器小结

    1.基本选择器 $("#id") //ID选择器 $("div") //元素选择器 $(".classname") //类选择器 $(&qu ...

  8. Miller-Rabin素性测试

    有时候我们想快速的知道一个数是不是素数,而这个数又特别的大导致 $O(\sqrt n)$ 的算法也难以通过,这时候我们可以对其进行 Miller-Rabin 素数测试,可以很大概率测出其是否为素数. ...

  9. js实现填写身份证号、手机号、准考证号等信息自动空格的效果

    咱们做网站的,用户体验那是相当重要的,比如12306抢票需要填写身份证,如果不空格,密密麻麻的给我一种很压抑的感觉,而且也不容易核对信息是否填写正确,所以我就写了一个利用Js实现填写身份证号.手机号. ...

  10. 基本数据类型-MySQL

    整型: TINYINT 最小 1个字节 -128~127 0~255 SMALLINT 较小 2个字节 -32768~32767 0~65535 MEDIUMINT 中等大小 3个字节 略   INT ...