12-Flutter移动电商实战-首页导航区域编写

1、导航单元素的编写

从外部看,导航是一个GridView部件,但是每一个导航又是一个上下关系的Column。小伙伴们都知道Flutter有多层嵌套的问题,如果我们都写在一个组件里,那势必造成嵌套严重,不利于项目以后的维护工作。所以我们单独把每一个自元素导航拿出来,一个方法,返回一个组件。

代码如下:详细的解释可以观看视频。

class TopNavigator extends StatelessWidget {  final List navigatorList;  TopNavigator({Key key, this.navigatorList}) : super(key: key);

  Widget _gridViewItemUI(BuildContext context,item){    return InkWell(      onTap: (){print(‘点击了导航‘);},      child: Column(        children: <Widget>[          Image.network(item[‘image‘],width:ScreenUtil().setWidth(95)),          Text(item[‘mallCategoryName‘])        ],      ),    );  }}

2、GridView制作导航

这个制作我们还是在外层嵌套一个Container组件,然后直接使用GridView。代码如下:

@override  Widget build(BuildContext context) {    return Container(      height: ScreenUtil().setHeight(320),      padding:EdgeInsets.all(3.0),      child: GridView.count(        crossAxisCount: 5,        padding: EdgeInsets.all(4.0),        children: navigatorList.map((item){          return _gridViewItemUI(context, item);        }).toList(),      ),    );  }

需要注意的是children属性,我们使用了map循环,然后再使用toList()进行转换。

3、数据处理和Bug解决

在HomePage的build方法里声明一个List变量,然后把数据进行List转换。再调用TopNavigator自定义组件。

 List<Map> navigatorList =(data[‘data‘][‘category‘] as List).cast(); //类别列表  TopNavigator(navigatorList:navigatorList),  //导航组件

这时候进行预览界面,你会发现界面有些问题,就是多了一个类别,并不是我们想要的10个列表,其实如果正常,这应该是后端给数据的一个Bug。但是我们是没办法去找后端麻烦的,所以只能自己想办法解决这个问题。

解决的办法就是把List进行截取,方法如下。

if(navigatorList.length>10){      navigatorList.removeRange(10, navigatorList.length);}

全部完整代码:

import ‘dart:convert‘;

import ‘package:flutter/material.dart‘;import ‘../service/service_method.dart‘;import ‘package:flutter_swiper/flutter_swiper.dart‘;import ‘package:flutter_screenutil/flutter_screenutil.dart‘;

class HomePage extends StatefulWidget {  _HomePageState createState() => _HomePageState();

}

class _HomePageState extends State<HomePage> {

  String homePageContent=‘正在获取数据‘;

  @override  Widget build(BuildContext context) {    return Scaffold(        appBar: AppBar(          title: Text(‘百姓生活+‘),        ),        body:FutureBuilder(            future: getHomePageContent(),            builder: (context,snapshot){              if(snapshot.hasData){                var data = json.decode(snapshot.data.toString());                List<Map> swiper = (data[‘data‘][‘slides‘] as List).cast();                List<Map> navigatorList = (data[‘data‘][‘category‘] as List).cast(); 类别列表

                return Column(                  children: <Widget>[                    SwiperDiy(swiperDataList: swiper,),                    TopNavigator(navigatorList: navigatorList,)                  ],                );              }else{                  return Center(                    child: Text("加载中"),                  );              }            },        )    );  }}

轮播组件class SwiperDiy extends StatelessWidget {

  final List swiperDataList;

  SwiperDiy({Key key,this.swiperDataList}):super(key:key);

  @override  Widget build(BuildContext context) {    ScreenUtil.instance = ScreenUtil(width: 750,height: 1334)..init(context);    return Container(      height: ScreenUtil().setHeight(333),      width: ScreenUtil().setWidth(750),      child: Swiper(          itemCount: swiperDataList.length,          itemBuilder: (BuildContext context,int index){              return Image.network("${swiperDataList[index][‘image‘]}",fit:BoxFit.fill);          },          pagination: SwiperPagination(),          autoplay: true,      ),    );  }}

class TopNavigator extends StatelessWidget {

  final List navigatorList;

  TopNavigator({this.navigatorList});

  Widget _gradViewItemUi(BuildContext context,item){    return InkWell(      onTap: (){print("点击了导航");},      child: Column(        children: <Widget>[          Image.network(item[‘image‘],width: ScreenUtil().setWidth(95),),          Text(item[‘mallCategoryName‘])        ],      ),    );  }

  @override  Widget build(BuildContext context) {

    if(navigatorList.length>10){      navigatorList.removeRange(10, navigatorList.length);    }

    return Container(      height: ScreenUtil().setHeight(320),      padding: EdgeInsets.all(3.0),      child: GridView.count(          crossAxisCount: 5,          padding: EdgeInsets.all(4.0),        children: navigatorList.map((item){          return _gradViewItemUi(context, item);        }).toList(),      ),    );  }}

效果如下图所示:

原文地址:https://www.cnblogs.com/niceyoo/p/11029202.html

时间: 2024-10-24 10:03:47

12-Flutter移动电商实战-首页导航区域编写的相关文章

03-Flutter移动电商实战-底部导航栏制作

1.cupertino_IOS风格介绍 在Flutter里是有两种内置风格的: material风格: Material Design 是由 Google 推出的全新设计语言,这种设计语言是为手机.平板电脑.台式机和其他平台提供一致,更广泛的外观和感觉.我喜欢称它为纸墨设计.Material Design 风格是一种非常有质感的设计风格,并会提供一些默认的交互动画. cupertino风格:即 IOS 风格组件,它重现了很多经典的有 IOS 特性的交互和界面风格,让适用于 IOS 的人感觉亲切和

11-Flutter移动电商实战-首页_屏幕适配方案和制作

1.flutter_ScreenUtil插件简介 flutter_ScreenUtil屏幕适配方案,让你的UI在不同尺寸的屏幕上都能显示合理的布局. 插件会让你先设置一个UI稿的尺寸,他会根据这个尺寸,根据不同屏幕进行缩放,能满足大部分屏幕场景. github:https://github.com/OpenFlutter/flutter_ScreenUtil 这个轮子功能还不是很完善,但是也在一点点的进步,这也算是国内现在最好的Flutter屏幕适配插件了,又不足的地方你可以自己下载源码进行修改

Flutter移动电商实战 --(49)详细页_Stack制作底部工具栏

一直悬浮在最下面的 Stack层叠组件.里面用Row 可以横向布局 开始 stack如果想定位就要用position去定位. 修改return返回值的这个地方 大R刷新查看效果,可以看到固定的在左下角的测试的字样.一直固定在底部 做底部的固定栏widget 新建页面:在文件夹details_page/details_bottom.dart 在布局用三个InkWell 因为都是可以点击的 加入购物车的InkWell 立即购买,复制购物车的InkWell改改就可以了. 引用这个组件 效果展示 最终代

Flutter移动电商实战 --(48)详细页_详情和评论的切换

增加切换的效果,我们主要是修改这个地方 这样我们的评论的内容就显示出来了 最终代码 details_web.dart import 'package:flutter/material.dart'; import 'package:provide/provide.dart'; import '../../provide/details_info.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'p

如何设计电商APP首页

我这里分析的"产品陈列设计"并非建立在专业领域的概念,而是通过实战总结的经验. 关于产品陈列设计要把握的几个原则是: 1. 让新用户轻松找到产品,快速熟悉产品目录 2. 让老用户第一时间看到上架的新品 3. 陈列的目的是让用户快速找到自己想找的商品 4. 在APP内形成逛的氛围 5. 在合适的位置推出主打产品! 6. 每个功能模块所展示的产品数量要合理 7. 陈列的图片规格既要节省空间又要清晰表达产品特征! 8. 陈列中巧用文字和数据的影响 9. 不要滥用广告图! 10. 把握陈列中引

laravel 5.5 《电商实战 》基础布局

我们需要为我们的项目构建一个基础的页面布局,布局文件统一存放在 resources/views/layouts 文件夹中,布局涉及的文件如下: app.blade.php —— 主要布局文件,项目的所有页面都将继承于此页面: _header.blade.php —— 布局的头部区域文件,负责顶部导航栏区块: _footer.blade.php —— 布局的尾部区域文件,负责底部导航区 我们先创建主要布局文件:resources/views/layouts/app.blade.php: $ mkd

laravel 5.5 《电商实战 》安装应用

最近开始接触电商业务.公司打算采用lavarel做后端的开发,出于学习成本和时间的考虑.自己找到了一个不错的收费教程.这段时间会同步更新,分享自己的学习过程. 自己的开发环境,mac+nginx+mysql5.6+php7.1 注意,如果没有特别提示,分享中所有的命令执行都是在项目的根目录操作. 首先是版本的选择,因为要用于公司项目的开发,自己优先选择了LTS版本的laravel5.5 安装laravel很方便,直接输入指令 composer create-project laravel/lar

Vue+Koa2移动电商实战 (五)mock数据使用和布局

前面我们已经获取到了数据,这节我们就好把它用到我们的项目中来.这节课我们主要是使用flex布局和for循环是我们的type_bar展示出来. 关于flex布局的话如果还不是很了解的小伙伴儿可以查阅下阮一峰大神的博客(http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html) 首页商品分类栏的布局 HTML: 我们采用v-for的方式将商品分类栏循环出来,并给了每个图片百分之九十的宽度,我这里因为第一张图片格式不对,多以单独添加了宽度的 <d

电商商城首页总结

1.首先需要看设计稿是多少(750px),根据设计稿在设置rem,也就是设置html的字体大小,25*30=750 <!-- 在HTML开头就引入动态获取屏幕宽度 --> <!-- rem实现适配 --> <script type="text/javascript"> // 页面打开 立即计算 document.querySelector('html').style.fontSize = window.screen.width / 25 + 'px'