本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用。 逛丢官方网址:https://guangdiu.com/

flutter windows开发环境设置

flutter 项目实战一 新建 flutter 项目

flutter 项目实战二 网络请求

flutter 项目实战三 json数据解析以及Gson格式化flutter 项目实战二 网络请求

flutter 项目实战四 列表数据展示

flutter 项目实战五 item 点击跳转,webview加载

flutter 项目实战六 drawer侧边栏

flutter 项目实战七 bottomNavigationBar

flutter 项目实战八 下拉刷新 上拉加载

flutter 项目实战九 小时风云榜

先放上 本人 使用 kotlin 开发的逛丢的页面,kotlin开发的源码以及相关说明将在其他部分给出。

我们会按照此列表展示,但是UI会略有修改。

appBar部分为一个 Image 与 title ,不用详细的分解。

列表的Item 分解示意图如下

说名一下,row是横向排列的控件,column是竖向排列的控件。container 可设置边框边距等属性。

开始代码实现步骤。

新建一个 home_index.dart文件

class HomeIndex extends StatefulWidget{@overrideState<StatefulWidget> createState() {// TODO: implement createStatereturn IndexWidget();}
}class IndexWidget extends State<HomeIndex>{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn null;}}

flutter 页面新建的时候可以选择继承  StatefulWidget 以及 StatelessWidget,StatelessWidget是无状态值得,即不可使用setState更新变量,我们需要在获取数据之后来刷新页面加载数据,所以我们使用 StatefulWidget .然后修改 main() 中的代码加载HomeIndex.

此时 IndexWidget 的 build方法返回的还是空值,先完成appBar 部分,修改代码

class IndexWidget extends State<HomeIndex>{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text("首页",style: TextStyle(color: Colors.white),),leading: Icon(Icons.menu,color: Colors.white,),backgroundColor: Colors.green[500],),body: Text("列表数据等待设计"),);}}

运行代码

flutter中的所有的控件都是基于 Widget 所有可以使用 各widget 组合出各种效果。上面的appBar 中控件排列方式如下图(actions未展示),大概的位置如下图所示(请忽略图的美丑,示意即可)

下面按照之前的 item 分析设计列表数据。flutter中列表数据使用 ListView.builder 创建。

首先item用container包裹,里面是一个横向排列的Row控件,Row有两个子widget ,左边一个 image,右边一个 column ,column又分为两部分,上面一个Text,下面又是一个Row,而此Row又包含一个靠左显示的Text,以及靠右的有两个子Text的Row.分析完了,开始代码。

根据梳理好的结构关系,编写代码如下

class IndexWidget extends State<HomeIndex>{List<RstData> _listData;//设置列表数据@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text("首页",style: TextStyle(color: Colors.white),),leading: Icon(Icons.menu,color: Colors.white,),backgroundColor: Colors.green[500],),body: _listInfos(),);}//list列表Widget _listInfos(){return ListView.builder(itemCount: 3,//此处展示需要写成此形式,实际适用时  _listData==null?0:_listData.lengthitemBuilder: (content,index){return _listItem(null);});}//list列表的itemWidget _listItem(RstData rstdata){return Container(height: 110,//设置item的高度padding: EdgeInsets.all(5),//设置item的边距child: Row(children: <Widget>[Container(height: 100,margin: EdgeInsets.all(5),//设置图片的边距child: Image.network("https://l.guangdiu.com/29ddbc1dc1e151a2311604744f54510b.jpg?imageView2/2/w/224/h/224/format/jpg"),),//涉及到widget的大小或者边框的时候,使用container包裹Container(width: MediaQuery.of(context).size.width-120,child: Column(children: <Widget>[Text("拼多多 Apple 苹果 新iPad Air 10.5 英寸平板电脑 WLAN版 64GB 3749元包邮(直降250元)"),Expanded( //此处使用expanded 填充,然后设置container 的对其方式确保 在底部显示child:  Row(children: <Widget>[Container(alignment: Alignment.bottomLeft,//设置container的对其方式child: Text("天猫",style: TextStyle(color: Colors.green[500]),),),Expanded(child: Container(alignment: Alignment.bottomRight,//设置container的对其方式child: Row(mainAxisAlignment: MainAxisAlignment.end,//设置ROW的对其显示方式children: <Widget>[Text("3分钟前-",style: TextStyle(color: Colors.green[500]),),Text("今日值得买",style: TextStyle(color: Colors.green[500]),),],),),),],),),//expanded类似于Android View的layout_weight属性按照比例填充,flex: 为1 时可以不填写此属性],),),],),);}}

因为边界问题所以当widget需要设置宽高,对其方式等属性是,我们用container进行包裹,当控件需要占用一个不固定的空间时,我们用expanded 包裹,达到类似于 Android View的layout_weight的使用效果。

运行示例,app截图

基本样式已完成,下面的步骤是使用网络数据填充,并且给item添加一个框框

修改后的代码为

class IndexWidget extends State<HomeIndex>{List<RstData> _listData;//设置列表数据@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text("首页",style: TextStyle(color: Colors.white),),leading: Icon(Icons.menu,color: Colors.white,),backgroundColor: Colors.green[500],),body: _listInfos(),);}//list列表Widget _listInfos(){return ListView.builder(itemCount: _listData==null?0:_listData.length,//此处展示需要写成 3,实际适用时  _listData==null?0:_listData.lengthitemBuilder: (content,index){return _listItem(_listData[index]);});}//list列表的itemWidget _listItem(RstData rstdata){return Container(height: 110,//设置item的高度margin: EdgeInsets.only(left: 5,right: 5,top: 5),//设置item的边距decoration: BoxDecoration(border: Border.all(color: Colors.black54,width: 1),//设置边框的宽度 以及 颜色borderRadius: BorderRadius.all(Radius.circular(5)),//设置圆角),child: Row(children: <Widget>[Container(height: 100,margin: EdgeInsets.all(5),//设置图片的边距child: Image.network(rstdata.image),),//涉及到widget的大小或者边框的时候,使用container包裹Expanded(child: Container(margin: EdgeInsets.only(right: 5),child: Column(children: <Widget>[Text(rstdata.title),Expanded( //此处使用expanded 填充,然后设置container 的对其方式确保 在底部显示child:  Row(children: <Widget>[Container(alignment: Alignment.bottomLeft,//设置container的对其方式child: Text(rstdata.mall,style: TextStyle(color: Colors.green[500]),),),Expanded(child: Container(alignment: Alignment.bottomRight,//设置container的对其方式child: Row(mainAxisAlignment: MainAxisAlignment.end,//设置ROW的对其显示方式children: <Widget>[Text("${rstdata.pubtime}-",style: TextStyle(color: Colors.green[500],fontSize: 10),),Text(rstdata.fromsite,style: TextStyle(color: Colors.green[500],fontSize: 10),),],),),),],),),//expanded类似于Android View的layout_weight属性按照比例填充,flex: 为1 时可以不填写此属性],),),),],),);}@overridevoid initState() {// TODO: implement initStatesuper.initState();//项目加载时去获取数据_getGuangdiuIndexData();}void _getGuangdiuIndexData() async{String url="getlist.php";FormData formData=FormData();formData.add("markid", "5685521");Response resp=await HttpUtil().post(url,data: formData).then((resp){RespResult respResult=RespResult.fromJson(resp.data);setState(() {_listData=respResult.data;});});}
}

此处在 initState 中获取数据,所有不用热加载更新,否则看不到数据。重新运行项目等到数据列表

此为数据的展示样式

码云 git 下载

flutter 项目实战四 列表数据展示相关推荐

  1. flutter 项目实战二 网络请求

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  2. 12、Flutter - 项目实战 - 仿微信(六)聊天页面

    Flutter - 项目实战 - 仿微信(六)聊天页面 接上篇:11.Flutter - 项目实战 - 仿微信(五)通讯录 详细代码参见Demo Demo地址 -> wechat_demo 其他 ...

  3. Flutter 项目实战(Dio+MVP+FutureBuilder )五

    / 没有感情万千 .只有默默无闻 / 2022年跨年了,又涨了一岁.随着时光的流逝,工作多年的我还是在坚持些代码.互联网都有所谓的大龄危机,我对此毫无畏惧.不要因为社会存在一些大龄危机的恐慌,产生了很 ...

  4. 视频教程-全新大数据企业电商数据仓库项目实战教程-大数据

    全新大数据企业电商数据仓库项目实战教程 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥有丰 ...

  5. Flutter项目实战之女装商城------火爆专区实现、商品分类数据准备

    火爆专区实现: 继续Flutter项目的学习,在上一次https://www.cnblogs.com/webor2006/p/14410445.html咱们已经对于首页的大部分功能已经完成,但是呢,还 ...

  6. vue商城项目开发:axios发送请求及列表数据展示

    使用axios发送get请求 先install一下axios: 在main.js中全局引入axios: 仅仅在main.js中引入axios不会生效: 第二种解决方法如下,也是最常用的: 使用$htt ...

  7. Spark Core项目实战(1) | 准备数据与计算Top10 热门品类(附完整项目代码及注释)

      大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  8. 【语义分割项目实战】Augmentor数据增强与U-Net的综合应用

    之前已经介绍过了数据增强工具Augmentor的使用 [语义分割项目实战]基于Augmentor工具的语义分割中常见几种数据增强方式(一)_Bill-QAQ-的博客-CSDN博客 以及简单的复现U-N ...

  9. Java全栈(四)web网页技术:15.书城项目实战四:管理端图书的增删改查(后台)

    1.需求澄清 管理端图书管理页面[book_manager.jsp]页面原型如下: 需要实现图书的添加.删除.修改.分页显示等操作 2.前期准备 2.1 创建数据表books create TABLE ...

最新文章

  1. html 判断boolean,js关于if()else{}中的判定条件的认识,各种数据类型转换为Boolean类型的转换规则...
  2. php 判定pc端與移動端
  3. 数学建模模型概述框架
  4. nginx tomcat集群实现session共享
  5. java中常见的几种内部类,你会几个?(未完)
  6. 领域情报搜索实践:真实场景下的问答实施策略与风险分析
  7. 学习jQuery formValidator
  8. php本机绿色调试,php本地调试工具下载|
  9. Java数据结构的知识体系
  10. java内存漏洞_处理Java程序中的内存漏洞
  11. 自行车中的物理知识汇总
  12. java案例代码14-guiJframe简单小案例
  13. ffmpeg: 一款跨平台开源媒体格式转换器
  14. 关于MeScroll的下拉刷新,上拉加载的js框架的学习和使用
  15. 多媒体个人计算机的特点,多媒体特征
  16. cad文字递增快捷键_cad文字修改快捷键是什么,Auto CAD文字修改快捷键是什么?
  17. 第一章:自己动手写区块链之最小可行区块链
  18. SQL 练习题标准答案(点个赞呀)
  19. c语言迷宫问题程序流程图,c语言程序设计 迷宫问题
  20. 荣耀x10更新鸿蒙,华为手机不要乱买,这4款是最值得选择的,全都可升级到鸿蒙系统...

热门文章

  1. 使用mob获取短信验证码
  2. python网络爬虫程序技术_Python网络爬虫程序技术-中国大学mooc-题库零氪
  3. java球球大作战小游戏代码_windows游戏编程:球球大作战(吃鸡版)源码
  4. python画出十二星座图形
  5. Clickhouse在头条火山引擎智能数据洞察的应用
  6. 关于ECMP 等价路由
  7. 计算出租车费用问题python
  8. 【Pandas学习】读、存excel数据
  9. ubunto 重启和关机命令
  10. Excel函数大全五《逻辑与信息函数》