62.购物车_首页Provide化 让跳转随心所欲 新建provide/currentIndex.dart 内容比较简单,定义一个变量当前页面的索引currentIndex,再定义一个方法改变它的值 provide全局注册main.dart index_page.dart 引入provide和currentIndexProvide 然后把首页的代码先都注释掉,之前我们这个页面是一个StateFul的widget,现在我们要改成静态的 原来的一些代码也可以用 下面开始重写index页面 写buil…
52.购物车_数据模型建立和Provide修改 根据json数据生成模型类 {,"price":830.0,"images":"http://images.baixingliangfan.cn/shopGoodsImg/20181229/20181229211422_8507.jpg"} https://javiercbk.github.io/json_to_dart/ model文件夹下新建类cartInfo.dart 类名叫做CartInfo…
53.购物车_商品列表UI框架布局 cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartPage单词拼错了,这里改过来防止后面,运行app的时候报错 build内我们使用scaffold脚手架 创建Future方法获取购物车持久化数据 取数据需要等待时间的,所以之类使用异步async,我们的provide需要context上下文,所以方法内我们要接收一个context对象的参数 在bod…
54.购物车_商品列表子项布局 子项做成一个单独的页面 新建cartItem.dart文件 新建cart_page文件夹,在里面新建cart_item.dart页面, 页面名字叫做CartItem 定义变量,购物车的model类,构造函数接收 先做一下上下左右的边距,margin是外边距.padding是内边距 内边距,外边距,下边的边框样式 我们这里使用Row布局,把没一块都分成一个单独的Widget防止嵌套 首先编写复选按钮的样式 商品图片方法: 商品名称 因为我们还要做商品的数量的加减,所…
55.购物车_底部结算栏UI制作 主要做下面结算这一栏目 cart_bottom.dart页面 先设置下内边距 拆分成三个子元素 全选 因为有一个文本框和一个全选的text文本,所以这里也用了Row布局 合计 先用column布局,上下分成两块,然后上面一行再用Row布局 每行的宽度设置为430的宽度 结算按钮 组合三个小部件 放到页面中预览 cart_page.dart 这里我们使用stack组件,这样把原来的ListView当做子组件嵌入到Stack组件内 效果预览: 我自己打的代码又溢出了…
56.购物车_商品数量控制区域制作 主要做购物车中的数量这里 cart_page文件夹下新建cart_count.dart 减少按钮 因为会有点击事件,所以这里我们使用InkWell. child里面外层套一个Container,为什么要外层始终套一个Container呢,因为我们可以设置内边距.外边距.宽和高等等 //减少按钮 Widget _reduceBtn(){ return InkWell( onTap: (){}, child: Container( width: ScreenUti…
57.购物车_在Model中增加选中字段 先修改model类 model/cartInfo.dart类增加是否选中的属性 修改provide 修改UI部分pages/cart_page/cart_item.dart 测试效果 出现问题的原因,应该是在购物车内持久化的数据,没有isCheck这个新增加的属性,所以就报错了我们需要先点进去一个商品,把持久化的购物车数据清空掉,再重新添加购物车的持久化数据 然后重新添加几个商品到购物车内 最终代码 model/cartInfo.dart class C…
58.购物车_删除商品功能制作 主要做购物车后面的删除按钮 删除的方法写在provide里面 provide/cart.dart文件 传入goodsId,循环对比,找到后进行移除 //删除单个购物车商品 deleteOneGoods(String goodsId) async{ SharedPreferences prefs=await SharedPreferences.getInstance(); cartString=prefs.getString('cartInfo'); List<Ma…
59.购物车_计算商品价格和数量 本节课主要是加上自动计算的功能 provide/cart.dart 在provide的类里面增加两个变量 cart_bottom.dart 三个组件因为我们都需要套一层provide所以这里都传入context对象 把三个组件方法,分别都加上context 引入provide和cart.dart import 'package:provide/provide.dart'; import '../../provide/cart.dart'; 总价 从provide…
60.购物车_全选按钮的交互效果制作 主要做全选和复选框的这两个功能 provide/cart.dart 业务逻辑写到provide里面 先持久化取出来字符串,把字符串编程list.循环list cart_page/cart_item.dart 每一项的复选框的事件 单个复选框的效果预览 全部取消,价格和数量都发生了变化 全选按钮 全选单独声明一个变量, 然后我们需要在获取全部购物车列表的方法里面做一些事情 循环之前先初始化为true,循环的时候只要是有没选中的那么全选就是false cart_…
61.购物车_商品数量的加减操作 provide/cart.dart pages/cart_page/cart_count.dart 先引入provide和cartProvide 定义接收一个item对象的参数 把加减的方法都加上下文对象 添加和减少的点击事件 中间数字的数量的设置 cart_item.dart cart_item在调用CartCount的时候需要传入上篇的单个对象 效果演示: 修正一个地方provide/cart.dart 这里toString是放在外面的 最终代码: prov…
63.购物车_详细页显示购物车商品数量 购物车的图标嵌套在statck组件里面 外层套了一个stack组件 数量我们需要用Provide 返回一个container来做样式 气泡效果,中间是个数字外面 是一个圆 如果想组成一个圆的形式,内边距就必须用formLRB这种形式 点击加入购物车后,数量发生变化provide/cart.dart provide/cart.dart 效果展示: 最终代码 details_page/detail.dart import 'package:flutter/ma…
51.购物车_Provide中添加商品 新加provide的cart.dart页面 引入三个文件.开始写provide类.provide需要用with 进行混入 从prefs里面获取到数据,判断有没有数据,如果有数据就返转正List<Map> 判断是否有重复的记录,如果有重复记录就数量+1,如果数据不存在就加入到tempList数组中,最后把tempList数据转成字符串,进行持久化 清空购物车的方法 清空的方法比较简单,注意这里是异步的 给两个方法最后都加上通知 provide的全局依赖 在…
16.补充_保持页面状态 修正一个地方: 设置了item的高度为380 横向列表为380.最终build的高度也增加了50为430. 增加了上面的高度以后,下面那个横线划掉的价格可以显示出来了. 但是还是有超出的问题. 保持首页页面状态 每次点击底部的tab标签.再点击首页,首页的数据就会重新加载. 这里就用到了混入,在页面上进行混入:with AutomaticKeepAliveClientMixin 混入之后必须主要三点: 第一,添加混入 第二:重写wantKeepAlive方法,返回为tr…
02.Flutter实战建立项目和编写入口文件 创建项目: flutter create flutter_shop 创建完成之后呢,它会提示我们, 进入flutter_shop的目录,然后执行flutter run来运行项目 为什么起名flutter_shop用下划线的形式呢?因为在windows下不支持小驼峰和大驼峰的命名方式,官方推荐我们使用下划线的形式 做项目的时候,外层都套一个Container组件呢,这样会使你以后扩展会变的很容易 开始写入口文件main.dart 新建文件夹Pages…
25.列表页_使用Provide控制子类-1 主要是二级分类的UI布局 1分15秒 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 开始写我的大类别:是一个横向的ListView.写横向的ListView就必须设置宽和高 ListView如果是纵向的不需要设置高度,如果是横向的就必须设置宽和高 这里使用构造器的形式,动态构造.ListView.builder() 大类的代码: 调用我们的大类 布局的划分:最外层用Row,右侧用上…
26.列表页_使用Provide控制子类-2 主要实现功能,点击一级分类,二级分类跟着变.这里主要用哦我们的provide 新建provide provide文件夹下创建:child_category.dart 事件上就是这个实体:BxMallSubDto 这样我们的Provide类就写完了. 然后在main.dart中注册provide import './provide/child_category.dart'; 继续category_page.dart 先引入我们的provide和chil…
33.列表页_子类和商品列表交互效果 主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口说明: https://jspang.com/posts/2019/03/01/flutter-shop.html#%E5%90%8E%E7%AB%AF%E6%8E%A5%E5%8F%A3api%E6%96%87%E6%A1%A3 大类id Provide化 当我们点击左侧的大类的时候,要把当前的大…
03.底部导航栏制作 material是谷歌退出的 还有另外的一种:cupertino是IOS的风格 我们底部的导航栏,静态的widget是不合适的,这垃圾我们用到动态的widget 这重新改成动态的组件 依然叫做IndexPage 声明一个List来放我们底栏的图标啊 文件啊,List我们希望是不变的,是个常量 所以我们用Final来定义 我们再复制三个BottomNavigationBarItem元素 最终代码: import 'package:flutter/material.dart';…
10.首页_FlutterSwiper轮播效果制作 博客地址: https://jspang.com/post/FlutterShop.html#toc-5c2 flutter_swiper https://github.com/best-flutter/flutter_swiper pubspec.yaml内配置插件的引用.配置好以后进行保存.最好开启***工具 防止下载很慢的情况 这里还是和视频里面用一个版本的吧 1.1.4因为我在本机设置为1.1.6的时候,保存了文件没有自动去下载包文件.…
12.首页_GridView类别导航制作 首页导航区的制作 外面用一个gridview来写.里面单独提出来 新建导航组件 还是在home_page.dart里面写代码 新建一个静态的组件: 快捷键写组件的时候选择哪个stlessW的,这样把构造函数也帮你初始化好了. 定义一个内部的方法 ,返回的是一个column,内部方法名开头用下划线开头. 定义方法 _gridViewItemUI接收两个参数一个是上下文对象,一个item相当于我们每一个导航项 我们导航项点一下肯定要有页面的变化,或者是路由的…
24.Provide状态管理基础 Flutter | 状态管理特别篇 —— Provide:https://juejin.im/post/5c6d4b52f265da2dc675b407?tdsourcetag=s_pcqq_aiomsg 点击左侧的导航右侧的导航发生变化,这属于两个widget.这两个widget之间进行通讯.用setstate的形式,耦合性太强 状态管理有这么几种方案 这里我们用Provide,谷歌自己退出的 https://github.com/google/flutter…
47.详细页_Flutter_html插件的使用 详情里面是hemlt和图片组成的,但是flutter是不支持html的所以需要其他插件 flutter webview plugin:这个不太好用 flutter_html:用这个插件 先解决之前一个bug 在加载详情页面的时候,控制台输出报错了. 需要用的到异步的处理 provide/details_info.dart类的方法:getGoodsInfo html插件 https://github.com/Sub6Resources/flutte…
49.详细页_Stack制作底部工具栏 一直悬浮在最下面的 Stack层叠组件.里面用Row 可以横向布局 开始 stack如果想定位就要用position去定位. 修改return返回值的这个地方 大R刷新查看效果,可以看到固定的在左下角的测试的字样.一直固定在底部 做底部的固定栏widget 新建页面:在文件夹details_page/details_bottom.dart 在布局用三个InkWell 因为都是可以点击的. 加入购物车的InkWell 立即购买,复制购物车的InkWell改改…
50.持久化_shared_preferences 当app关掉了.再进去的时候 ,购物车的内容还是存在. sqflite提供这个来操作SQLite数据库 flutter提供三种持久化的工具 今天要学的就是 shared_preferences 还有一种持久化就是:file,用流的形式去读取还是有些慢 安装shared_preferences 插件地址: https://github.com/flutter/plugins/tree/master/packages/shared_preferen…
34.列表页_小BUG的修复 当高粱酒的子类没有数据返回的时候就会报错. 解决接口空数据报错的问题 没有数据的时候,给用户一个友好的提示, 我们没有数据的时候还要告诉用户,提示一下他没有数据,在我们的右侧列表的build方法内去判断 友好提示展示效果: 子类的id状态化 状态管理里面,定义小类的变量,并根据传入的id根性赋值.这样我们在点击小类的时候,需要也传入小类的id 这样我们在小类点击事件里面,传入小类的id就可以了 测试程序 点击小类进行测试 最终代码: provide/child_ca…
04.底部导航栏切换效果 博客地址: https://jspang.com/post/FlutterShop.html#toc-291 我们要做的效果图: 新建四个页面 home_page.dart home_page.dart为了展示切换效果,所以代码比较简单.中间放个Center,center里面再放一个Text文本就可以了. 剩下的企业几个页面都做相应的复制就可以了. 分类页面 购物车页面 会员中心页面 IndexPage页面引入四个子页面 引入四个页面以后,需要定义一个List变量.把四…
05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https://github.com/flutterchina/dio pubspec.yaml 这两者的区别: dependencies是生产环境中 dev_dependencies:开发环境,上线的是时候不会被打包进去. 添加我们的Dio 这样就表示下载好了 在我们的首页去发送一个请求. home_page.…
博客地址: https://jspang.com/post/FlutterShop.html#toc-0ee 编写页面代码 创建动态组件HomePage,原来的代码是静态的我们这里就去掉就可以了. 然后使用column布局来写我们的代码 Column就是我们的列布局 TextField只有设置了controller,才能获取到文本框的值.首先我们放的是一个TextField文本框 我们在上面声明typeController.它的类型是:TextEditingController showText…
07.Dio基础_POST请求的使用 越界问题解决 容器越界的问题,越界是因为键盘弹起的问题.如果键盘不弹起是不会越界 我们加一个滚动组件就可以解决. 这是技术胖视频中出现的越界的截图效果 这是我自己电脑上开发的效果,没有出现越界的问题: 我们在这里外层套一个组件:SingleChildScrollView 把原来我们的container组件放在SingleChildScrollView里面 视频中的问题就解决了. easy-mock https://easy-mock.com/login po…