Flutter五:Flutter基础Widget

目录

  1. 文本和字体
  2. 按钮
  3. 图片和Icon
  4. 单选框和复选框
  5. 输入框和表单
  6. 进度指示器

基础Widget

一、文本和字体

文本组件( tex )负责显示文本和定义显示样式,类似Android中的TextView。

Text(
          "This is a page NewRoute" * 8,//显示8个text
          maxLines: 20,
          textAlign: TextAlign.center,
          overflow: TextOverflow.clip,
          textScaleFactor: 2,
          style: TextStyle(
            //字体颜色
            color: Colors.white,
            //字体大小
            fontSize: 18,
            //行高因子
            height: 1.2,
            //字体
            fontFamily: "Courier",
            //字体背景
            background: new Paint()
              ..color = Colors.amber,
            //分割线
            decoration: TextDecoration.overline,
            //分割线风格:wavy-波浪,dashed-间隔线,double-双实线,dotted-小点线,
            decorationStyle: TextDecorationStyle.solid,
            //分割线颜色
            decorationColor: Colors.purple,
          ),
        ),

二、按钮

①RaisedButton:漂浮按钮,默认带有阴影和灰色背景。按下后,阴影会变大

RaisedButton(
            //背景颜色
            color: Colors.red,
            //正常的阴影
            elevation: 8,
            //按下时的阴影
            highlightElevation: 8.0,
            onPressed: () {
              Navigator.pop(context);
            },
            child: Text('返回'),
          ),

②FlatButton:扁平按钮,默认背景透明并不带阴影。按下后,会有背景色

FlatButton(
  child: Text("normal"),
  onPressed: () {},
)

③OutlineButton:默认有一个边框,不带阴影且背景透明。按下后,边框颜色会变亮、同时出现背景和阴影(较弱)

OutlineButton(
  child: Text("normal"),
  onPressed: () {},
)

④IconButton:一个可点击的Icon,不包括文字,默认没有背景,点击后会出现背景

IconButton(
  icon: Icon(Icons.thumb_up),
  onPressed: () {},
)

⑤带图标的按钮:RaisedButton、FlatButton、OutlineButton都有一个icon 构造函数,通过它可以轻松创建带图标的按钮

RaisedButton.icon(
  icon: Icon(Icons.send),
  label: Text("发送"),
  onPressed: _onPressed,
),
OutlineButton.icon(
  icon: Icon(Icons.add),
  label: Text("添加"),
  onPressed: _onPressed,
),
FlatButton.icon(
  icon: Icon(Icons.info),
  label: Text("详情"),
  onPressed: _onPressed,
),

⑥自定义按钮外观:按钮外观可以通过其属性来定义,不同按钮属性大同小异,我们以FlatButton为例

FlatButton(
  color: Colors.blue,
  highlightColor: Colors.blue[700],
  colorBrightness: Brightness.dark,
  splashColor: Colors.grey,
  child: Text("Submit"),
  shape:RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),
  onPressed: () {},
)

三、图片

  1. 说明
  • Flutter中,使用Image组件来加载并显示图片,可以是asset、文件、内存以及网络等数据。
  • ImageProvider
    ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。
  • Image
    Image widget有一个必选的image参数,它对应一个ImageProvider。
    Image属性表
属性名称 类型 说明
alignment AlignmentGeometry 图像边界内对齐图像。
centerSlice Rect 九片图像的中心切片。
color Color 该颜色与每个图像像素混合colorBlendMode。
colorBlendMode BlendMode 用于 color 与此图像结合使用。
fit BoxFit 图像在布局中分配的空间。
gaplessPlayback bool 当图像提供者发生变化时,是继续显示旧图像(true)还是暂时不显示(false)。
image ImageProvider 要显示的图像。
matchTextDirection bool 是否在图像的方向上绘制图像 TextDirection。
repeat ImageRepeat 未充分容器时,是否重复图片。
height double 图像的高度。
width double 图像的宽度。

BoxFit取值表

属性名称 样式
BoxFit.contain 全图居中显示但不充满,显示原比例
BoxFit.cover 图片可能拉伸,也可能裁剪,但是充满容器
BoxFit.fill 全图显示且填充满,图片可能会拉伸
BoxFit.fitHeight 图片可能拉伸,可能裁剪,高度充满
BoxFit.fitWidth 图片可能拉伸,可能裁剪,宽度充满
BoxFit.scaleDown 效果和contain差不多, 但是只能缩小图片,不能放大图片
  1. 从assets中加载图片
    ①在工程根目录下创建一个images目录,并将图片avatar.png拷贝到该目录。
    ②在pubspec.yaml中的flutter部分添加如下内容:
 assets:
     - images/avatar.png
  • 注意: 由于 yaml 文件对缩进严格,所以必须严格按照每一层两个空格的方式进行缩进,此处assets前面应有两个空格。
    ③加载该图片
Image(
  image: AssetImage("images/avatar.png"),
  width: 100.0
);

Image也提供了一个快捷的构造函数Image.asset用于从asset中加载、显示图片:

Image.asset("images/avatar.png",
  width: 100.0,
)
  1. 从网络加载图片
Image(
  image: NetworkImage(
      "http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg"),
  width: 100.0,
)

Image也提供了一个快捷的构造函数Image.network用于从网络加载、显示图片:

Image.network(
  "http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg",
  width: 100.0,
)
  1. 圆形与圆角
    Image 是不支持圆角和阴影的,目前可以通过使用 CircleAvatar 和 Container 实现。
  • 圆形方式一:
CircleAvatar(
              backgroundImage: NetworkImage("http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg"),
            ),
  • 圆形方式二:
Container(
              width: 100.0,
              height: 100.0,
              decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  image: DecorationImage(
                      image: NetworkImage("http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg"),
                      fit: BoxFit.cover)),
            ),
  • 圆角
Container(
              width: 100.0,
              height: 100.0,
              decoration: BoxDecoration(
                  shape: BoxShape.rectangle,//这里需要设置为 rectangle
                  borderRadius: BorderRadius.all(Radius.circular(20)),//rectangle 时,BorderRadius 才有效
                  image: DecorationImage(
                      image: NetworkImage("http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg"),
                      fit: BoxFit.cover)),
            )

四、 Icon

  1. 简介
    Flutter中,Icon是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。

在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只是将位码对应的字形做成了图标,所以不同的字符最终就会渲染成不同的图标。

在Flutter开发中,iconfont和图片相比有如下优势:

①体积小:可以减小安装包大小。
②矢量的:iconfont都是矢量图标,放大不会影响其清晰度。
③可以应用文本样式:可以像文本一样改变字体图标的颜色、大小对齐等。
④可以通过TextSpan和文本混用。

  1. 使用
Icon(
      Icons.home,
    )

ListTile(
          leading: Icon(
            Icons.person_add,
            color: Colors.red,
          ),
          title: Text('登录'),
          onTap: () {},
        )

五、单选框和复选框

Material 组件库中提供了Material风格的单选开关Switch和复选框Checkbox,虽然它们都是继承自StatefulWidget,但它们本身不会保存当前选中状态,选中状态都是由父组件来管理的。当Switch或Checkbox被点击时,会触发它们的onChanged回调,我们可以在此回调中处理选中状态改变逻辑。下面看一个简单的例子:

class SwitchAndCheckBoxTestRoute extends StatefulWidget {
  @override
  _SwitchAndCheckBoxTestRouteState createState() => new _SwitchAndCheckBoxTestRouteState();
}

class _SwitchAndCheckBoxTestRouteState extends State<SwitchAndCheckBoxTestRoute> {
  bool _switchSelected=true; //维护单选开关状态
  bool _checkboxSelected=true;//维护复选框状态
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Switch(
          value: _switchSelected,//当前状态
          onChanged:(value){
            //重新构建页面  
            setState(() {
              _switchSelected=value;
            });
          },
        ),
        Checkbox(
          value: _checkboxSelected,
          activeColor: Colors.red, //选中时的颜色
          onChanged:(value){
            setState(() {
              _checkboxSelected=value;
            });
          } ,
        )
      ],
    );
  }
}
  • 属性及外观
    Switch和Checkbox属性比较简单,读者可以查看API文档,它们都有一个activeColor属性,用于设置激活态的颜色。至于大小,到目前为止,Checkbox的大小是固定的,无法自定义,而Switch只能定义宽度,高度也是固定的。值得一提的是Checkbox有一个属性tristate ,表示是否为三态,其默认值为false ,这时Checkbox有两种状态即“选中”和“不选中”,对应的value值为true和false 。如果tristate值为true时,value的值会增加一个状态null,读者可以自行了解。

六、 输入框和表单

Material组件库中提供了输入框组件TextField和表单组件Form。

  1. TextField

  2. Form

七、 进度指示器

Material 组件库中提供了两种进度指示器:LinearProgressIndicator和CircularProgressIndicator,它们都可以同时用于精确的进度指示和模糊的进度指示。精确进度通常用于任务进度可以计算和预估的情况,比如文件下载;而模糊进度则用户任务进度无法准确获得的情况,如下拉刷新,数据提交等。

轮播图

  1. 如果放在column中,必须使用container包裹swiper
  2. container高度可以写死,但是无法适配所有手机,我们可以使用aspectRadio
Container(
                width: double.infinity,
                child: AspectRatio(
                  aspectRatio: 16/9,
                  child: Swiper(
                    itemBuilder: (BuildContext contxt, int index) {
                      return Image.network(imgs[index], fit: BoxFit.cover);
                    },
                    itemCount: imgs.length,
                    pagination: SwiperPagination(),
                    //显示indicator
//                control: SwiperControl(), //显示箭头
                    loop: true,
                    autoplay: true,
                  ),
                )),
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容