美文网首页
Flutter之常用组件

Flutter之常用组件

作者: 好_好先生 | 来源:发表于2020-12-01 17:02 被阅读0次

    基础组件

    文本组件

    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)
            ])
    

    相关文章

      网友评论

          本文标题:Flutter之常用组件

          本文链接:https://www.haomeiwen.com/subject/vzvswktx.html