Flutter之常用组件

基础组件

文本组件

Text

用于显示简单样式文本,包含一些控制样式属性

Text(
"Text",
maxLines: 1, 
overflow: TextOverflow.ellipsis, // 超出部分...
style: TextStyle(
    fontSize: 12, color: Color(0xFF333333), fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
)

按钮与手势组件

IconButton

IconButton是一个可点击的Icon,不包括文字

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

RaisedButton

默认灰色的带阴影的按钮

RaisedButton(
child: Text("Text"),
onPressed: () {
    print("Text");
    })

带图标的按钮

RaisedButton.icon(
onPressed: () {
    print("Text");
    },
    icon: Icon(Icons.send),
    label: Text("Text"))

手势组件

GestureDetector

GestureDetector(
      child: Text("Text"),
      onTapUp: () {
        print("onTapUp");
      },
      onTapDown: () {
        print("onTapDown");
      },
      onTapCancel: () {
        print("onTapCancel");
      },
      onTap: () {
        print("onTap");
      },
      onDoubleTap: () {
        print("onDoubleTap");
      },
      onLongPress: () {
        print("onLongPress");
      },
    )

图片组件

Image

Widget image;
    if (this.imgUrl.isEmpty) {
      image = Image.asset(
        "placeholderPath",
        height: 75,
        width: 124,
        alignment: Alignment.center,
        repeat: ImageRepeat.noRepeat,
      );
    } else {
      image = FadeInImage.assetNetwork(
        fit: BoxFit.fill,
        placeholder: "placeholderPath",
        image: "http://xxxxx.png",
        height: 75,
        width: 124,
      );
    }
    return image;

单选框和复选框

Checkbox

Checkbox(
      value: isSelected,
      activeColor: Colors.red,
      onChanged: (value) {
        print(value);
      },
    )

单选开关

Switch(
      value: isSelected,
      activeColor: Colors.red,
      onChanged: (value){
      print(value);
    },)

裁剪组件

剪裁处理组件
Clip的相关组件:
ClipOval:圆形裁剪
ClipRRect:圆角矩形裁剪
ClipRect:矩形裁剪
ClipPath:路径裁剪

ClipOval(
child: SizeBox(
width: 100, height: 100, child: Image.network("http://xxxxx.png")),
)

隐藏与透明组件

opacity

透明度组件

Opacity(
opacity: 0.5,
child: Text("Text"),
)

Visibility

控制子组件是否可见的组件

Visibility(
visible: false,// 子组件是否可见,默认true
child: Text("Text"),// 子组件
replacement: Text("data"),// 不可见时显示的组件(当maintainState=false)
maintainState: true,//不可见时是否维持状态,默认为false
)

效果组件

InkWell

点击时有阴影效果

InkWell(
child: Text("Text"),
onTap: () {
print("Text");
},
)

容器类组件

脚手架

int _selectedIndex = 1;
  @override
  Widget build(BuildContext context) {
    return Scaffold(// 脚手架
      appBar: AppBar(// 导航栏
        title: Text("Text"),
        actions: [
          IconButton(
              // 导航栏右侧菜单
              icon: Icon(Icons.share),
              onPressed: () {
                print("share");
              })
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(// 底部导航栏
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.help_center),
          ),
        ],
        currentIndex: _selectedIndex,
        fixedColor: Colors.lightBlue,
        onTap: (index) {
          print("selected: $index");
          setState(() {
            _selectedIndex = index;
          });
        },
      ),
      body: IndexedStack(// 可以在一个组件上放置另一个组件,并且同时只显示一个组件
        index: _selectedIndex,
        children: [
          HomeScreen(),
          HelpCenterScreen()
        ],
      ),
    );
  }

其他容器

Container容器

是一个组合类的容器组件,不参与最终的渲染

Container(
      color: Colors.white, // 背景色
      decoration: BoxDecoration(color: Color(0xFFFFFFFF)), // 背景装饰(与color不能共存,同时只能有一个)
      width: 100,// 容器的宽度
      height: 100,// 容器的高度
      margin: EdgeInsets.only(left: 10, top: 10),
      padding: EdgeInsets.all(10),
      child: Text("Text"),
    )

SizeBox装饰类容器

可以设置具体尺寸的控件,child不为null时,如果设置宽高,则强制显示宽高,如果没有设置,则自适应;如果child为null时,可当做间隔使用

SizedBox(
      height: 16,
      child: Text("Text"),
    )

DecoratedBox装饰类容器

可以在其子组件绘制前(或者绘制后)绘制一些装饰,如背景、边框、渐变等

DecoratedBox(
      decoration: BoxDecoration(
        color: Colors.white,// 背景色
        borderRadius: BorderRadius.all(Radius.circular(2.0)),// 圆角
        border: Border.all(color: Colors.pink, width: 1),// 边框
        gradient: LinearGradient(colors: [Colors.red, Colors.orange[700]]),// 渐变
        boxShadow: [// 阴影
          BoxShadow(
              color: Colors.black12, offset: Offset(5.0, 5.0), blurRadius: 4.0)
        ],
      ), 
      child: Text("Text"),
    )

SafeArea安全区域

留出刘海和底部的安全区域,很好的解决刘海屏兼容问题

SafeArea(child: Text("Text"))

布局组件

线性布局

row

水平方向排布组件,不会自动换行

Row(
    mainAxisAlignment: MainAxisAlignment.start,// 主轴对齐方式
    crossAxisAlignment: CrossAxisAlignment.start,// 交叉轴对齐方式
      children: [
        Text("Text1"),
        Text("Text2"),
        Text("Text3"),
        Text("Text4"),
      ],
    )

column

垂直方向排布组件,不会自动换行

Column(
      children: [
        Text("Text1"),
        Text("Text2"),
        Text("Text3"),
        Text("Text4"),
      ],
    )

Expanded

可以使Row、Column、Flex等,子组件在其主轴上展开并填充可用空间,撑开父组件。必须使用在Row、Column、Flex等

Column(
      children: [
        Text("Text1"),
        Text("Text2"),
        Expanded(
          child: Text("Expanded"),
        ),
        Text("Text3"),
        Text("Text4"),
      ],
    )

弹性布局

Flex

如h5当中的弹性盒子布局,Row和Column都继承自Flex,参数也基本一致所以可以使用Row和Column来代替Flex

Flex(
      direction: Axis.horizontal,
      children: <Widget>[
        Text("Text1"),
        Text("Text2"),
        Text("Text3"),
        Text("Text4"),
      ],
    )

流式布局

Wrap、Flow

Wrap和Row类似,如果一行控件不够会自动换行
Flow和Column类似,如果一列控件不够会自动换行

Wrap(
      spacing: 8.0, // 主轴(水平)方向间距
      runSpacing: 8.0, // 纵轴(垂直)方向间距
      alignment: WrapAlignment.center, // 沿主轴方向居中
      children: <Widget>[
        Text("Text1"),
        Text("Text2"),
        Text("Text3"),
        Text("Text4"),
      ],
    )

层叠布局

Stack、positioned

类似绝对定位,往往与Positioned联合使用,子组件可以根据父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。

// 通过ConstrainedBox来确保Stack占满屏幕
ConstrainedBox(
      constraints: BoxConstraints.expand(),
      child: Stack(
        alignment: Alignment.center, // 指定未定位或部分定位widget的对齐方式
        fit: StackFit.expand, // 未定位widget占满Stack整个空间
        children: <Widget>[
          Container(
              child: Text("Container"), style: TextStyle(color: Colors.white)
              color: Colors.red,),
          Positioned(
            left: 18.0,
            child: Text("left"),
          ),
          Positioned(
            top: 18.0,
            child: Text("top"),
          )
        ],
      ),
    )

相对定位

Align

Align组件可以调整子组件的位置,并且可以根据子组件的宽高来确定自身的宽高

Container(
      height: 120.0,
      width: 120.0,
      color: Colors.blue,
      child: Align(
        alignment: Alignment.topRight,
        child: Text("Text"),
      ),
    )

可滚动组件

ListView

ListView是最常用的可滚动组件之一,它可以沿一个方向线性排布所有子组件,并且它也支持基于Sliver的延迟构建模型

ListView(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      padding: const EdgeInsets.all(20.0),
      children: <Widget>[// 使用children只适用于组件较少的情况
        const Text("Text1"),
        const Text("Text2"),
        const Text("Text3"),
        const Text("Text4"),
        const Text("Text5"),
      ],
    )

子组件较多时使用ListView.builder

ListView.builder(
        itemCount: 100,
        itemExtent: 50.0, // 强制高度为50.0
        itemBuilder: (BuildContext context, int index) {
          return ListTile(
            title: Text("$index"),
          );
        })

GridView

GridView可以构建一个二维网格列表

GridView(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3, childAspectRatio: 1.0),
        children: [
          Icon(Icons.ac_unit),
          Icon(Icons.airport_shuttle),
          Icon(Icons.all_inclusive),
          Icon(Icons.beach_access),
          Icon(Icons.cake),
          Icon(Icons.free_breakfast)
        ])
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容