Flutter笔记(慕课网)

原作者:Andings
版权声明:本文版权归本人所有,未经作者许可,不得以任何形式转载

简介

Flutter学习笔记,学习途径包括但不仅限于:Flutter官网、慕课网、掘金/简书平台。

学习编写第一个Flutter程序

import 'package:flutter/material.dart';

void main() => runApp(HelloWorld());

class HelloWorld extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "第一个Flutter应用",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("第一个Flutter应用"),
        ),
        body: new Center(
          child: new Text("Hello World!"),
        ),
      ),
    );
  }
}

思路:

我们首先创建一个HelloWorld类,让他继承自StatelessWidget(玄冥二老之一的widget)

StatelessWidget是我们开发Flutter中最核心的Widget,stateless意思为状态不可改变的Widget,我们常常用来写一些静态页面,也就是状态不需要改变的页面肯定继承它了,与之对应的就是状态可以改变的组件视图StatefullWidget,这两大组件是Flutter开发中玄冥二老。

在源码中是StatelessWidget是一个抽象类,子类继承的话必须实现方法bulid(),返回的是一个Widget对象,这完全符合开发思想,既然是不可改变的视图,那我们直接返回一个组件Widget即可(它总是显示该Widget),其他的我们并不需要要关心,比如视图改变的情况...

ok,既然build()方法需要我们返回一个Widget,我们该返回哪一个?Flutter一切皆组件(所有的视图都是继承Widget),是不是返回任意的widget就可以呢?显然并不是,这时我们需要返回一个MaterialApp,这是谷歌建议我们遵循Material的风格规范来编写界面,所以,界面上看到都是在MaterialApp中定义的。

MaterialApp是显示的核心类,其中常用的属性有:title和home,其中title是标题的意思,直接给一个字符串就好了。

title: 'helloWorld'

我们重点关心home属性,Ctrl+鼠标左键可以查看需要返回什么,What?,又是返回Widget?这里将返回一个非常重要的Widget———脚手架Widget,它才是真正是显示组件,其中定义appBar以及页面中显示什么,这里用到的属性标签:appBar和body

 home: Scaffold(
        appBar: new AppBar(
          title: new Text('TextWidget'),
        ),
        body: new Center(
          child: Text('HelloWorld'),
        ),
      ),

其中,appBar里面又有很多属性,title表明appBar上显示的文本内容,当然还有其他属性

body表明页面主题将显示哪种视图,需要返回的依旧是Widget对象,这里Center组件表明,内容将显示在视图中心区域,然后又是嵌套,定义Center中的属性......

总结:
StatelessWidget、build()、MaterialApp->title->home、脚手架Scaffold、appBar、body、Center->child

  1. 首先继承StatelessWidget抽象类,实现bulid方法
  2. return一个MaterialApp
  3. 定义App内的title,和home
  4. home属性需要返回脚手架Scaffold组件
  5. 脚手架定义appBar和body属性,appBar中定义text,body中创建Center
  6. 在Center居中组件中,利用child属性,返回一个TextWidget,用来显示内容

TextWidget

作用:显示一段文本在界面上,类似于Android中的TextView控件
TextWidget常用属性有:

  • TextAlig:文本对齐属性
  • maxLines:最大显示行数
  • overflow:控制文本溢出效果

如何控制字体大小,样式?textWidget为我们提供了style标签来控制

style: TextStyle(
        fontSize: 20.0,
        color:Color.fromARGB(255, 255, 150, 150),
        decorationStyle: TextDecorationStyle.solid,
        decoration: TextDecoration.underline
        ),

ContainerWidget容器

作用:可以用来放置多个子组件,类似于Android中的布局Layout,可以对子元素进行布局操作。

常用属性:

  • alignment:子控件对齐方式,例如:顶部居中alignment: Alignment.topCenter
  • width:控件的宽
  • height: 控件的高
  • color:控件的背景样色 例如color: Colors.blue,
  • padding:内间距
  • margin:外间距
  • decoration:设置容器边框
new Container(
            child: new Text('Hello World',
            style: TextStyle(fontSize: 40),
            ),
            alignment: Alignment.center,
            width: 200.0,
            height: 400.0,
            color: Colors.blue,
            padding: EdgeInsets.all(50) ,
            margin: EdgeInsets.all(50),
          ),

图片组件ImageWidget

图片的显示是任何一个应用不可或缺的一部分,图片比文字更有吸引力,Flutter也为我们提供了非常方便快捷的api。

图片的获取途径?

  • Image asset:加载本地图片资源,会使打包体积变大
  • Image.network:网络资源图片,需要经常更换或者需要动态显示的图片
  • Image file:本地图片,例如:相机中的图片...
  • Image memory:加载到内存中的图片,Uint8List,不常用

这里我们介绍一下常用的网络图片加载:

代码演示

child: new Image.network(
            'https://img3.mukewang.com/5c1677390001169809600960-140-140.jpg',
            scale: 1.5,
            fit: BoxFit.fill,
          ),

直接new 一个Image.network即可,默认需要一个url属性值即可加载图片
常用属性值:

  • scale: 图片的缩放
  • fit: 相对于父容器,图片拉伸或填充

列表组件ListView

列表组件是我们开发中用的最多的组件之一,Flutter为我们提供了非常方便的Api调用,我们并不需要关系性能问题,直接使用即可。
这里我们演示一个简单的例子:

new ListView(
          children: <Widget>[
            new ListTile(
              leading: new Icon(Icons.access_time),
              title: new Text('你好'),
            ),
            new Image.network("https://img3.mukewang.com/5c1677390001169809600960-140-140.jpg"),
            new Image.network("https://img3.mukewang.com/5c1677390001169809600960-140-140.jpg"),
            new Image.network("https://img3.mukewang.com/5c1677390001169809600960-140-140.jpg"),
          ],
        )

new出一个ListView组件后,利用child属性,返回一个Widget数组,数组中的组件将是ListView的数据源,我们可以随意添加Widget,图片文字都可以。

为了方便每个Widget的组合,我们可以使用ListTile这个组件,他是ListView的小瓦片,相当于每一个Item,我,额可以再这个组件中组合图片或者文字,这样每一个listItem就是一个图片和文字的组合了。

1.ListView动态(通过传参的方式)

刚刚只是一个list静态列表,数据都是写死的,我们现在来做一个动态的列表,也就是说数据是不确定的,由服务端或者后端传递过来的,我们得到数据然后传递到列表当中进行显示,这就涉及到数据的传递知识,属于Dart的基础知识,我们一起来了解一下。

构造器:我们知道在初始化一个类的时候,默认是调用无参的构造器,当然我们也可以手动添加有参数的构造器,可以在初始化的时候可以传参,所以我们在构造器中声明形参来接收传递过来的参数,下面来看实例:

void main() => runApp(
    //这里在初始化对象时,传递了一个参数
  new ListViews(items: new List<String>.generate(1000, (i) => "Item $i")));
  
  class ListViews extends StatelessWidget {
  
  final List<String> items;

  //构造器接收参数
  ListViews({Key key, @required this.items}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "dad",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('ListView'),
        ),
        body: new ListView.builder(
            itemCount: items.length,
            itemBuilder: (context, index) {
              return new ListTile(title: new Text('${items[index]}'));
            }),
      ),
    );
  }
}

可以看到,我们在new的时候,传递了一个List对象给构造器,通过List的generate方法快速生成一个1000大小的列表。
然后在类的构造器中去接收到这个List参数,然后给类的ListView组件使用,达到动态数据,list的数据源是由外部接受的的,这样我们的ListView数据将会非常灵活。

2.横向列表的使用

横向列表顾名思义就是,可以通过水平方向进行一个列表的滑动,左右滑动列表Item,即可浏览ListView的数据了。

scrollDirection属性的使用

  • Axis.vertical:垂直方向
  • Axis.horizontal 水平方向

非常简单,我们直接修改属性值就可以完成不同方向的ListView
附上完整代码:


import 'package:flutter/material.dart';

void main() => runApp(new HorizontalList());

class HorizontalList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('横向list'),
        ),
        body: new Center(
          child: new Container(
            height: 200.0,
            child: new MyList()
          ),
        ),
      ),
    );
  }
}

//简化代码 提取出来单独
class MyList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new ListView(
      scrollDirection: Axis.horizontal,
      children: <Widget>[
        new Container(
          width: 180.0,
          color: Colors.amber,
        ),
        new Container(
          width: 180.0,
          color: Colors.cyanAccent,
        ),new Container(
          width: 180.0,
          color: Colors.deepOrange,
        ),new Container(
          width: 180.0,
          color: Colors.amber,
        ),new Container(
          width: 180.0,
          color: Colors.lightBlue,
        ),
      ],
    );
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容