Flutter(七)——多子元素组件:GridView,CustomScrollView,Flex,Wrap

简介: Flutter(七)——多子元素组件:GridView,CustomScrollView,Flex,Wrap

前言


上一篇介绍了多元素组件:ListView,Scaffold,AppBar,Row,Column,这一节将接着上一篇博文,介绍GridView,CustomScrollView,Flex,以及Wrap多元素组件(下图为CustomScrollView实现效果)


GridView


首先,就是GridView,它和ListView相似,只不过表现形式为网格形式,可以把它看成Android的LayoutManager。如果GridView组件掌握的很好,那么App界面也是会非常好看,给人赏心悦目。不过需要注意的是,GridView中的gridDelegate属性,其类型是SliverGridDelegate,是一个抽象类,通过该类可以控制GridView的排列显示方式,我们先来看看官方文档的使用方式:

body: GridView.count(
        primary: false,
        padding: const EdgeInsets.all(20.0),
        crossAxisSpacing: 10.0,
        crossAxisCount: 2,
        children: <Widget>[
          const Text("11111111111111111111"),
          const Text("22222222222222222222"),
          const Text("33333333333333333333"),
          const Text("44444444444444444444"),
          const Text("55555555555555555555"),
          const Text("66666666666666666666"),
        ],
      ),


这里我们没有看到代码中使用SliverGridDelegate,那么它在哪里呢?其实,在GridView.count中的构造函数里已经传入了默认的gridDelegate,通过开发工具我们进入它的源码:

gridDelegate = SliverGridDelegateWithFixedCrossAxisCount(
         crossAxisCount: crossAxisCount,
         mainAxisSpacing: mainAxisSpacing,
         crossAxisSpacing: crossAxisSpacing,
         childAspectRatio: childAspectRatio,
       ),


源码里已经使用了SliverGridDelegateWithFixedCrossAxisCount。它有四个属性,我们先来看看他们的定义:

属性 取值
crossAxisCount 横向轴子元素的数量
mainAxisSpacing 横向轴之间的间距
crossAxisSpacing 子元素之间的间距
childAspectRatio 子元素的宽高比,比如2.0就表示宽度是高度的2倍

gridDelegate还支持SliverGridDelegateWithMaxCrossAxisExtent,同时GridView也和ListView一样支持GridView.builder来创建,使用代码与ListView差不多,这里就不在赘述了,上面代码实现效果如下:


CustomScrollView


在实际应用里,布局情况并不是非此即彼,一般一个界面不会只有一个滚动列表组件,很可能还有别的组件,这个时候CustomScrollView就有用处了,它的使用代码如下:

return CustomScrollView(
      slivers: <Widget>[
        const SliverAppBar(
          pinned: true,//标题栏是否固定
          expandedHeight: 250.0,//合并的高度,默认是状态栏的高度加AppBar的高度
          flexibleSpace: FlexibleSpaceBar(
            title: Text("我的标题"),
          ),
        ),
        SliverGrid(
            delegate: SliverChildBuilderDelegate((BuildContext context,int index){
              return Container(
                alignment: Alignment.center,
                color: Colors.teal[100*(index%9)],
                child: Text("第$index个"),
              );
            },childCount: 20),
            gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 200.0,//单个子Widget的水平最大宽度
                mainAxisSpacing: 10.0,//水平单个子Widget之间间距
                crossAxisSpacing: 10.0,//垂直单个子Widget之间间距
                childAspectRatio: 4.0,//宽高比
            )
        ),
        SliverFixedExtentList(
          itemExtent: 50.0,
          delegate: SliverChildBuilderDelegate((BuildContext context,int index){
            return Container(
              alignment: Alignment.center,
              color: Colors.lightBlue[100*(index%9)],
              child: Text("第$index个"),
            );
          }),
        ),
      ],
    );


这段代码看起来非常复杂其实很好理解,在Scaffold中,Appbar等价于SliverAppBar,刚讲解的GridView等价于SliverGrid,而ListView等价于SliverFixedExtentList,所以这是一个包含了二个滑动组件的一个布局容器,其他的代码中有注释,这里就不赘述了。(显示效果如博文首图)


特别注意:转换后的组件都是以“Sliver”开头的,其本身是不具备滚动特性的,但是放在CustomScrollView中之后,则可以实现滚动的功能。


Flex


Flex英文意思是屈伸,活动,在Flutter里面也就是弹性布局,该布局借鉴了前端里的Flex布局方式。用法也十分简单,我们可以在Flex中传入一些参数,其具体属性如下表:

属性

取值
direction Axis.vertical表示垂直方向,Axis.horizontal表示水平方向
flex 弹性系数,大于0会按比例来分割,等于0不会扩展占用的空间

可以把它理解为android:layout_weight属性,使用代码如下:

return Scaffold(
      appBar: AppBar(title: Text("Flex布局玩法"),),
      body: Column(
        children: <Widget>[
          Container(
            height: 400.0,
            child: Flex(
              direction: Axis.vertical,
              children: <Widget>[
                Expanded(
                  flex: 1,
                  child: Container(
                    color: Colors.red,
                  ),
                ),
                Expanded(
                  flex: 2,
                  child: Container(
                    color: Colors.yellow,
                  ),
                ),
              ],
            ),
          ),
          Container(
            height: 120.0,
            child: new Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Expanded(
                  flex: 2,
                  child: Container(
                   color: Colors.blueAccent,
                  ),
                ),
                Expanded(
                  flex: 1,
                  child: Container(
                    color: Colors.red,
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );


上面的例子中,我们实现了Flex布局。这种布局还有一种方式,它通过在Row组件里设置两边对齐也可以实现,代码显示效果如下:


Wrap


Wrap英文字面是包裹的意思,在前端开发中,我们通常把具有相同的布局整合在一个大的布局组件之内,比如说前面一节使用Row去包裹一些组件,因为它是多子元素组件,但是Row有时候会出问题,比如实际子组件超过屏幕,在这种情况下,我们就需要使用Wrap去代替Row组件,使用代码如下:

return Scaffold(
      appBar: AppBar(title: Text("Wrap组件玩法"),),
      body: Wrap(
        spacing: 4.0,
        runSpacing: 4.0,
        children: <Widget>[
          Container(
            color: Colors.yellow,
            child: Text("Python编程指南",style: new TextStyle(color: Colors.lightBlue),),
          ),
          Container(
            color: Colors.yellow,
            child: Text("Android编程指南",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("Flutter",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("VUE",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("Scaffold",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("Container",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("Colors",style: new TextStyle(color: Colors.lightBlue),)
          ),
          Container(
              color: Colors.yellow,
              child: Text("Colors.yellow",style: new TextStyle(color: Colors.lightBlue),)
          ),
        ],
      ),
    );

其实就是自适应控件布局容器,当一行放不下的时候会自动换行显示,这在Java开发中并没有配套的控件,需要自定义View,而Flutter开发中,直接提供了该组件,实现效果如下:

多子元素组件到这里就全部讲解完成,下一篇博文将介绍Flutter状态管理。

相关文章
|
2月前
|
开发者 UED 容器
鸿蒙next版开发:ArkTS组件通用属性(Flex布局)
在HarmonyOS next中,ArkTS的Flex布局是一种强大且灵活的布局方式,支持水平或垂直方向排列元素,并能动态调整大小和位置以适应不同屏幕。主要属性包括justifyContent、alignItems、direction和wrap,适用于导航栏、侧边栏和表单等多种场景。示例代码展示了如何使用这些属性创建美观的布局。
128 10
|
2月前
Flutter 自定义组件继承与调用的高级使用方式
本文深入探讨了 Flutter 中自定义组件的高级使用方式,包括创建基本自定义组件、继承现有组件、使用 Mixins 和组合模式等。通过这些方法,您可以构建灵活、可重用且易于维护的 UI 组件,从而提升开发效率和代码质量。
148 1
|
2月前
|
开发工具 UED
Flutter&鸿蒙next中封装一个输入框组件
本文介绍了如何创建一个简单的Flutter播客应用。首先,通过`flutter create`命令创建项目;接着,在`lib`目录下封装一个自定义输入框组件`CustomInput`;然后,在主应用文件`main.dart`中使用该输入框组件,实现简单的UI布局和功能;最后,通过`flutter run`启动应用。本文还提供了后续扩展建议,如状态管理、网络请求和UI优化。
114 1
|
2月前
|
小程序
Flutter CustomScrollView 效果-顶栏透明与标签栏吸顶
Flutter CustomScrollView 效果-顶栏透明与标签栏吸顶
|
2月前
|
Dart UED
Flutter用户交互组件
Flutter用户交互组件
36 2
|
3月前
|
存储 开发框架 开发者
flutter:代码存储&基本组件 (五)
本文档介绍了Flutter中的一些基本组件和代码示例,包括代码存储、基本组件如AppBar的简单使用、可滑动切换的标签栏、TextField的多种用法(如简单使用、登录页面、文本控制器的监听与使用、修饰等),以及如何实现点击空白区域隐藏键盘等功能。通过这些示例,开发者可以快速掌握在Flutter应用中实现常见UI元素的方法。
|
2月前
|
开发工具
Flutter&鸿蒙next中封装一个列表组件
Flutter&鸿蒙next中封装一个列表组件
61 0
|
3月前
|
开发者
flutter:功能性组件 (八)
本文介绍了Flutter中常用的UI组件和功能,包括进度指示器(线性和圆形)、下拉刷新、选项按钮(单选按钮、复选框、开关)、手势识别(GestureDetector、Ink和InkWell)以及提示和Offstage组件的使用方法和示例代码。这些组件和功能可以帮助开发者快速构建交互丰富的应用程序界面。
|
前端开发 容器
flutter GridView 九宫格
* GridView的构造函数方法,一次性构建所有的子条目,适用于少量数据 * GridView.builder方式来构建,懒加载模式,适用于大量数据的情况 * GridView.count方式来构建,适用于固定列的情况,适用于少量数据 GridView.extent 方式来构建,适用于条目有最大宽度的限制的情况,适用于少量数据的情况下 * GridView.custom 方式来构建,可配置子条目的排列规则也可配置子条目的渲染加载模式
flutter GridView 九宫格
|
5天前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】