一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

代码文档

Flutter防京东商城源码(1-10)链接

Flutter防京东商城源码(11-20)链接

Flutter防京东商城源码(21-30)链接

Flutter防京东商城源码(31-46)链接

效果:

本章目标:
1.创建商品数据模型
2.请求Api接口渲染热门商品
3.获取数据然后用模型赋值给猜你喜欢和热门推荐

第一步:编写全局接口文档

class Config{static String domain="http://jd.itying.com/";
}

第二步:修改图片轮播器接口 红色这句代码复制修改就可以了

说明:前面的章节接口是整个接口的,现在改为域名+路径
回到home页面进行导入。

import '../../config/Config.dart';

var api = '${Config.domain}api/focus';

第三步:开始编写模型

首先要先拿到接口先 http://jd.itying.com/api/plist?is_best=1 接口里面返回的数据模型是用于热门推荐和猜你喜欢的。

下面的内容是请求http://jd.itying.com/api/plist?is_best=1接口返回的数据,以防将来接口失效可以用下面的数据写成本地。

{"result":[{"_id":"5a0425bc010e711234661439","title":"磨砂牛皮男休闲鞋-有属性","cid":"5a042480010e711234661436","price":"688","old_price":"368","pic":"public\\upload\\RinsvExKu7Ed-ocs_7W1DxYO.png","s_pic":"public\\upload\\RinsvExKu7Ed-ocs_7W1DxYO.png_200x200.png"},{"_id":"5a0432f4010e71123466144c","title":"八匹狼羽绒服男--有属性","cid":"59f1e4f49bfd8f3bd030eed9","price":"288","old_price":"588","pic":"public\\upload\\agbBbaTUWBnWD7pYQOyJsNgJ.png","s_pic":"public\\upload\\agbBbaTUWBnWD7pYQOyJsNgJ.png_200x200.png"},{"_id":"5a07ef1fad8b300e28e2feb6","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑","cid":"59f1e4919bfd8f3bd030eed6","price":"5345","old_price":"5345","pic":"public\\upload\\4i2vxChhbbz2qJMYEUGWw8g_.jpg","s_pic":"public\\upload\\4i2vxChhbbz2qJMYEUGWw8g_.jpg_200x200.jpg"},{"_id":"5a07ef64ad8b300e28e2feb8","title":"神舟(HASEE)战神K650D-G4D2 15.6英寸游戏笔记本电脑","cid":"59f1e4919bfd8f3bd030eed6","price":"4500","old_price":"4500","pic":"public\\upload\\iG8QZV0x7Thh8ZFKA3bCTER5.jpg","s_pic":"public\\upload\\iG8QZV0x7Thh8ZFKA3bCTER5.jpg_200x200.jpg"},{"_id":"5a07efe9ad8b300e28e2febb","title":"戴尔DELL灵越游匣Master15-R4645R 15.6英寸游戏笔记本电脑","cid":"59f1e4919bfd8f3bd030eed6","price":5677,"old_price":"6778","pic":"public\\upload\\YUv6N37Lriv7QK7WePQmyz-u.jpg","s_pic":"public\\upload\\YUv6N37Lriv7QK7WePQmyz-u.jpg_200x200.jpg"},{"_id":"5a080a05ad8b300e28e2fec1","title":"小米 红米Note5A 全网通版 2GB+16GB 香槟金 移动联通电信4G手机 双卡双待","cid":"59f1e4919bfd8f3bd030eed6","price":688,"old_price":"688","pic":"public\\upload\\1X_pUZmj8jQrVrWeiRtoa4Zx.jpg","s_pic":"public\\upload\\1X_pUZmj8jQrVrWeiRtoa4Zx.jpg_200x200.jpg"},{"_id":"5a080a9fad8b300e28e2fec6","title":"荣耀 畅玩6X 4GB 32GB 全网通4G手机 高配版 玫瑰金","cid":"59f1e4919bfd8f3bd030eed6","price":"789","old_price":"11111","pic":"public\\upload\\HSAZYh1vXyzn3kvpso4fs7iT.jpg","s_pic":"public\\upload\\HSAZYh1vXyzn3kvpso4fs7iT.jpg_200x200.jpg"},{"_id":"5a080ac5ad8b300e28e2fec7","title":"三星 Galaxy S7 edge(G9350)4GB+32GB 铂光金 移动联通电信4G手机","cid":"59f1e4919bfd8f3bd030eed6","price":1233,"old_price":"1322","pic":"public\\upload\\SesgdVtaD0RzW2B5NKXcTmEK.jpg","s_pic":"public\\upload\\SesgdVtaD0RzW2B5NKXcTmEK.jpg_200x200.jpg"},{"_id":"5a080b2ead8b300e28e2fec9","title":"小米Max2 全网通 4GB+64GB 金色 移动联通电信4G手机 双卡双待 6.44英寸大","cid":"59f1e4919bfd8f3bd030eed6","price":980,"old_price":"1211","pic":"public\\upload\\e7Z7qLeDpyFjNZMF2Ke1aiTE.jpg","s_pic":"public\\upload\\e7Z7qLeDpyFjNZMF2Ke1aiTE.jpg_200x200.jpg"},{"_id":"5a080c2ead8b300e28e2fed1","title":"锤子 坚果Pro 64GB 酒红色 全网通 移动联通电信4G手机 双卡双待 火热抢购中,","cid":"59f1e4919bfd8f3bd030eed6","price":1456,"old_price":"1468","pic":"public\\upload\\E8jnbcercoZGdllR3r9QN5aD.jpg","s_pic":"public\\upload\\E8jnbcercoZGdllR3r9QN5aD.jpg_200x200.jpg"}]}

拿到接口请求数据回来,然后打开 https://jsontodart.com/ 去自动生成Model 如果网站丢失就去百度输入JsonToDart 搜索。

模型名称为 ProductModel

在ProductModel模型中需要注意的是必须要修改一个地方,不然项目运行会崩溃
网上生成的模型多数是string类型,需要自己手动修改一下。

Object price;   //所有的类型都继承 Object

最终模型代码:


class ProductModel {List<ProductItemModel> result;ProductModel({this.result});ProductModel.fromJson(Map<String, dynamic> json) {if (json['result'] != null) {result = new List<ProductItemModel>();json['result'].forEach((v) {result.add(new ProductItemModel.fromJson(v));});}}Map<String, dynamic> toJson() {final Map<String, dynamic> data = new Map<String, dynamic>();if (this.result != null) {data['result'] = this.result.map((v) => v.toJson()).toList();}return data;}
}class ProductItemModel {String sId;String title;String cid;Object price;String oldPrice;String pic;String sPic;ProductItemModel({this.sId,this.title,this.cid,this.price,this.oldPrice,this.pic,this.sPic});ProductItemModel.fromJson(Map<String, dynamic> json) {sId = json['_id'];title = json['title'];cid = json['cid'];price = json['price'];oldPrice = json['old_price'];pic = json['pic'];sPic = json['s_pic'];}Map<String, dynamic> toJson() {final Map<String, dynamic> data = new Map<String, dynamic>();data['_id'] = this.sId;data['title'] = this.title;data['cid'] = this.cid;data['price'] = this.price;data['old_price'] = this.oldPrice;data['pic'] = this.pic;data['s_pic'] = this.sPic;return data;}
}

第四步:在首页中编写代码

1.导入模型

//热门跟推荐模型
import '../../model/ProductModel.dart';
// import 'package:review_flutter_app/model/ProductModel.dart';

2.创建接收model的数组

List _hotProductList = [];
List _bestProductList = [];

3.编写获取数据的方法

//获取猜你喜欢的数据
_getHotProductData() async {//编写接口var api = '${Config.domain}api/plist?is_hot=1';//请求数据var result = await Dio().get(api);//格式化数据var hotProductList = ProductModel.fromJson(result.data);//更新UIsetState(() {this._hotProductList = hotProductList.result;});
}//获取热门推荐的数据
_getBestProductData() async {//编写接口var api = '${Config.domain}api/plist?is_best=1';//请求数据var result = await Dio().get(api);//格式化数据var bestProductList = ProductModel.fromJson(result.data);//更新UIsetState(() {this._bestProductList = bestProductList.result;});
}

第五步:程序启动时调用该方法

  _getHotProductData();_getBestProductData();

把上面的这两句代码写到下面的图片中,页面进来就请求接口,获取数据。

第六步:UI中赋值



源码

//热门商品
Widget _hotProductListWidget() {if (this._hotProductList.length > 0){return Container(height: ScreenAdaper.height(234),padding: EdgeInsets.all(ScreenAdaper.width(20)),child: ListView.builder(scrollDirection: Axis.horizontal,itemCount: 10,itemBuilder: (context, index) {//处理图片String sPic = this._hotProductList[index].sPic;//——————————---------sPic = Config.domain + sPic.replaceAll('\\', '/');//——————————---------return Column(children: <Widget>[Container(height: ScreenAdaper.height(140),width: ScreenAdaper.width(140),margin: EdgeInsets.only(right: ScreenAdaper.width(21)),child: Image.network(sPic,//——————————---------fit: BoxFit.cover,),),Container(padding: EdgeInsets.only(top: ScreenAdaper.width(10)),height: ScreenAdaper.height(44),child: Text(//——————————---------'¥${this._hotProductList[index].price}',//——————————---------style: TextStyle(color: Colors.red),//——————————---------),//——————————---------),],);}),);}else{//——————————---------return Text('记载中....');//——————————---------}//——————————---------
}

热门推荐商品




Widget _recProductItemWidget() {var itemWidth = (ScreenAdaper.getScreenWidth() - 30) / 2; //计算容器宽度大小return Container(padding: EdgeInsets.all(10),child: Wrap(runSpacing: 10,spacing: 10,children: this._bestProductList.map((value){//图片String sPic=value.sPic;//—————————————————————————————————sPic=Config.domain+sPic.replaceAll('\\', '/');//—————————————————————————————————return Container(padding: EdgeInsets.all(10), //设置容器内边框为10width: itemWidth, //设置每个小容器的宽度decoration: BoxDecoration(//设置边框border: Border.all(color: Color.fromRGBO(233, 233, 233, 0.9), width: 1), //设置边框颜色跟变宽宽度),child: Column(children: <Widget>[Container(//添加容器抱住图片,目的是可以设置图片与最大容器之前的宽高比width: double.infinity,child: AspectRatio(aspectRatio: 1 / 1,child: Image.network("${sPic}",//—————————————————————————————————fit: BoxFit.cover,),),),Padding(//添加外边框抱住文字,目的是可以让文字与上面的图片有一个顶部距离20padding: EdgeInsets.only(top: ScreenAdaper.height(20)),child: Text("${value.title}",//—————————————————————————————————maxLines: 2,overflow: TextOverflow.ellipsis,style: TextStyle(color: Colors.black54),),),Padding(//添加外边框抱住文字,目的是可以让文字与上面的图片有一个顶部距离20padding: EdgeInsets.only(top: ScreenAdaper.height(20)),child: Stack(children: <Widget>[Align(alignment: Alignment.centerLeft, //控件在框的左边child: Text("¥${value.price}",//—————————————————————————————————style: TextStyle(color: Colors.red, fontSize: 16),),),Align(alignment: Alignment.centerRight, //控件在框的右边child: Text("¥${value.oldPrice}",//—————————————————————————————————style: TextStyle(color: Colors.black54,fontSize: 14,decoration: TextDecoration.lineThrough, //文字中间加下划线),),),],),),],),);}).toList(),),);
}

4.不过要注意的是热门推荐UI的结构要修改一下
(下面的内容看看就可以了,不用写)

  @overrideWidget build(BuildContext context) {ScreenAdaper.init(context);// TODO: implement buildreturn ListView(children: <Widget>[_swiperWidget(),SizedBox(height: ScreenAdaper.height(10),),_titleWidge('猜你喜欢'),SizedBox(height: ScreenAdaper.height(10),),_hotProductListWidget(),SizedBox(height: ScreenAdaper.height(10),),_titleWidge('热门推荐'),_recProductItemWidget(),],);}
}

Flutter-防京东商城项目-创建商品数据模型 、请求Api接口渲染热门商品 推荐商品 获取数据然后模型赋值-06相关推荐

  1. 京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口

    一.京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口代码对接如下: 1.请求参数: 名称 类型 必须 描述 key String 是 调用key ...

  2. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器...

    加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^0.1.22 AddressAdd.dart import ...

  3. Flutter-防京东商城项目-提交订单、去支付页面制作-44

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  4. Flutter-防京东商城项目-状态管理 多页面数据共享-23

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  5. Flutter-防京东商城项目-签名验证 增加收货地址、显示收货地址 事件广播-41

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  6. Flutter-防京东商城项目-编写注册(2)-35

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  7. Flutter-防京东商城项目-编写注册(1)-34

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  8. Flutter-防京东商城项目-订单列表、订单详情页面布局-45

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  9. tb获取商品详情信息API接口开发文档

    本文讲述了tb获取商品详情信息API接口,并展示tb商品详情API接口开发文档. 一.关于tb商品详情API接口 tb商品详情API接口服务器地址为: http://gjx.sd1118.com/ap ...

最新文章

  1. 一起做激光SLAM:ICP匹配用于闭环检测
  2. javaScript由哪些部分组成?
  3. python输入语句-python输入语句
  4. [转]Asp.Net Core 简单的使用加密的Cookie保存用户状态
  5. rk修改launcher_Android更改桌面应用程序launcher的两种方式
  6. 《Ceph源码分析》——第1章,第一节Ceph的发展历程
  7. android自定义弹出对话框,使用FlyDialog实现自定义Android弹窗对话框
  8. Apache HttpComponents在App里访问HTTP服务
  9. 【缓存】redis的基本使用
  10. php mysql设计中验证码的实现_php如何实现验证码功能
  11. MySql表里数据的限制
  12. vscode extensions
  13. JobScheduler布置后台任务以及实现进程保活?
  14. 汽车智造(一)| 移动机器人(AGV AMR)如何赋能汽车行业制造升级
  15. C语言——关于位段的理解
  16. GetPixel算法
  17. 汉诺塔问题的递归求解
  18. 怎么提高android播放器的网络带宽,使用GSYVideoPlayer增加显示实时网速
  19. how to trouble shoot thread hangs
  20. 复制微信号并跳转到微信界面

热门文章

  1. 小白学习cartopy画地图的第六天
  2. RFID在固定资产盘点系统中的应用
  3. DETR3D 多2d图片3D检测框架
  4. 百度图片时看到一张很眼熟,竟然是自己发的,这收录效率!
  5. MS-DOS基本操作汇总
  6. 【CVPR 2021】Cylinder3D:用于LiDAR点云分割的圆柱体非对称3D卷积网络
  7. 一文读懂GPU服务器
  8. 【模型压缩】蒸馏神经网络(Distill the Knowledge in a Neural Network)
  9. vue 根据链接生成二维码(功能实现)
  10. python 交通_Python可视化交通拥堵情况