视频地址;

https://www.bilibili.com/video/av39709290/?p=12

博客地址:

https://jspang.com/post/flutterDemo.html#toc-b97

要实现的效果;

这里主要是用我们的流式布局

顺序排,一般到头了 会顺序往下排列。

还会学到 媒体查询、手势操作

先写main.dart

创建warp_demo.dart

这个组件肯定是动态的。

那些加号都是数组生成的,所以这里声明一个数组。数组里面添加按钮,添加按钮我们需要单独写一个方法

我们的Container是没有手势识别的。如果想让它具有手势识别,就要外层给他加一个GestureDetector手势识别

相当于我们 html里面的div我们要向让它点击挑战链接的话,就在外层加一个a标签。

点击的时候触发的事件:我们现在还没有这个buildPhoto方法

创建黄色的正方形的组件buildPhoto方法

buildPhoto也返回一个widget

开始洗build

代码修正,

因为是一个动态的组件,所以要修改里面的list的状态的时候 必须使用setState方法

效果展示:

每次点击加好左侧就会加一个照片的黄色正方形。

代码:

  1. import 'package:flutter/material.dart';
  2. import 'warp_demo.dart';
  3. void main() => runApp(MyApp());
  4.  
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. title: 'Flutter Demo',
  10. theme: ThemeData.light(),//轻量级的皮肤
  11. home: WarpDemo()
  12. );
  13. }
  14. }

main.dart

  1. import 'package:flutter/material.dart';
  2.  
  3. class WarpDemo extends StatefulWidget {
  4. @override
  5. _WarpDemoState createState() => _WarpDemoState();
  6. }
  7.  
  8. class _WarpDemoState extends State<WarpDemo> {
  9. List<Widget> list;
  10.  
  11. void initState() {
  12. super.initState();
  13. list=List<Widget>()
  14. ..add(buildAddButton());//这里添加了一个buildAddButton的方法,我们在下面去创建
  15. }
  16. @override
  17. Widget build(BuildContext context) {
  18. final width=MediaQuery.of(context).size.width;//得到屏幕的宽度
  19. final height=MediaQuery.of(context).size.height;//屏幕的高度
  20. return Scaffold(
  21. appBar: AppBar(title: Text('Wrap流式布局'),),
  22. body: Center(//让它居中显示用
  23. child: Opacity(
  24. opacity: 0.8,//为了让它看起来有点透明的效果
  25. child: Container(
  26. width: width,
  27. height: height/,//屏幕高度的一半
  28. color: Colors.grey,
  29. child: Wrap(//然后使用流式布局
  30. children: list,//就把list放在这
  31. spacing: 26.0,//间距
  32. ),
  33. ),
  34. ),
  35. ),
  36. );
  37. }
  38. //这个方法返回了一个组件
  39. Widget buildAddButton(){
  40. // 手势识别,能识别我们手机上的好几种手势
  41. return GestureDetector(
  42. onTap: (){
  43. if(list.length<){
  44. setState(() {
  45. list.insert(list.length-, buildPhoto());
  46. });
  47. }
  48. },
  49. child: Padding(
  50. padding: const EdgeInsets.all(8.0),//内边距
  51. child: Container(
  52. width: 80.0,
  53. height: 80.0,
  54. color: Colors.black54,
  55. child: Icon(Icons.add),
  56. ),
  57. ),
  58. );
  59. }
  60.  
  61. Widget buildPhoto(){
  62. return Padding(
  63. padding: const EdgeInsets.all(8.0),
  64. child: Container(
  65. width:80.0,
  66. height: 80.0,
  67. color: Colors.amber,
  68. child: Center(
  69. child: Text('照片'),
  70. ),
  71. ),
  72. );
  73. }
  74. }

warp_demo.dart

  

20个Flutter实例视频教程-第12节: 流式布局 模拟添加照片效果的更多相关文章

  1. 20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1

    20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1 视频地址: https://www.bilibili.com/video/av39709290/?p=10 博客地址: https ...

  2. 20个Flutter实例视频教程-第13节: 展开闭合案例

    20个Flutter实例视频教程-第13节: 展开闭合案例 视频地址: https://www.bilibili.com/video/av39709290/?p=13 博客地址: https://js ...

  3. 20个Flutter实例视频教程-第03节: 不规则底部工具栏制作-1

    第03节: 不规则底部工具栏制作-1 博客地址: https://jspang.com/post/flutterDemo.html#toc-973 视频地址: https://www.bilibili ...

  4. 20个Flutter实例视频教程-第05节: 酷炫的路由动画-1

    视屏地址: https://www.bilibili.com/video/av39709290/?p=5 博客地址: https://jspang.com/post/flutterDemo.html# ...

  5. 20个Flutter实例视频教程-第02节: 底部导航栏制作-2

    视频地址: https://www.bilibili.com/video/av39709290?p=2 博客地址: https://jspang.com/post/flutterDemo.html#t ...

  6. 20个Flutter实例视频教程-第04节: 不规则底部工具栏制作-2

    视频地址: https://www.bilibili.com/video/av39709290/?p=4 博客地址: https://jspang.com/post/flutterDemo.html# ...

  7. 20个Flutter实例视频教程-第06节: 酷炫的路由动画-2

    博客地址: https://jspang.com/post/flutterDemo.html#toc-94f 视频地址: https://jspang.com/post/flutterDemo.htm ...

  8. 20个Flutter实例视频教程-第07节: 毛玻璃效果制作

    视频地址: https://www.bilibili.com/video/av39709290/?p=7 博客地址: https://jspang.com/post/flutterDemo.html# ...

  9. 20个Flutter实例视频教程-第08节: 保持页面状态

    博客地址: https://jspang.com/post/flutterDemo.html#toc-bb9 视频地址: https://www.bilibili.com/video/av397092 ...

随机推荐

  1. ORCAD元件属性白色区域和黄色区域的理解

    白色部分为instance属性,黄色部分为occurence 属性 在平坦式电路中,黄色部分是默认不显示的. 在层次式电路中,黄色部分会显示.      如果这两个区域的Reference不同,以黄色 ...

  2. Something about cache

    http://www.tyut.edu.cn/kecheng1/2008/site04/courseware/chapter5/5.5.htm 5.5 高速缓冲存储器cache 随着CPU时钟速率的不 ...

  3. Learning English From Android Source Code:2 Ampersand

    这一次想把标点符号的英语表达总结一下,这些单词非常重要但easy被我们忽视.以我的经验,还是多认识几个.以备不时之需. 以下从"标点符号"開始: punctuation [英][ˌ ...

  4. C# 之 集合ArrayList

    .NET Framework提供了用于数据存储和检索的专用类,这些类统称集合. 这些类提供对堆栈.队列.列表和哈希表的支持.大多数集合类实现系统的接口.以下我们主要来讲一下ArrayList.     ...

  5. maven的坑2

    导入工程后,pom.xml文件中以下插件报错: <plugin> <groupId>com.jayway.maven.plugins.android.generation2&l ...

  6. Oracle中,将毫秒数转换为timestamp类型的两种方法

    在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以NUMBER类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要 把这 ...

  7. 隐私问题成O2O绊脚石,加强行业监管迫在眉睫

        这年头,O2O的发展越来越给力了.因为O2O能充分结合互联网经济的线上优势和传统经济的线下优势,因此,传统商户纷纷借助O2O来开展业务,取得了不俗的成绩.只是,在移动互联网越来越"开 ...

  8. EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式

    本文转自Holo的博客:http://blog.csdn.net/u013758734/article/details/50834770 最近在研究EasyDarwin的Push库EasyPusher ...

  9. Mixtures of Gaussians and the EM algorithm

    http://cs229.stanford.edu/ http://cs229.stanford.edu/notes/cs229-notes7b.pdf

  10. 1.JavaScript:写入 HTML 输出

    ①JavaScript 是可插入HTML页面的编程代码 ②JavaScript插入HTML页面后,可有所有的现代浏览器执行 ※提示:您只能在 HTML 输出中使用 document.write.如果您 ...