0
点赞
收藏
分享

微信扫一扫

Flutter教程09——可滚动组件

Mhhao 2022-03-17 阅读 64
flutter

目录

1.可滚动组件介绍

1.1Scrollable

1.2Viewport

1.3Sliver

2.1Scrollbar

2.SingleChildScrollView


1.可滚动组件介绍

Flutter中有两种布局模型:Render的盒模型布局和Sliver按需加载列表布局。

可滚动的组件的子组件一般会很多,如果一次性全部加载会影响性能。为此Flutter提供了Sliver(片段),Sliver可以包含多个子组件。Sliver作用:按需加载子组件并确定每一个子组件的布局。

Flutter中可滚动主要由三部分组成:

Scrollable,用于处理滑动手势,确定滑动偏移,滑动时构建Viewport;

Viewport,显示的视窗,即列表的可视区域;

Sliver,视窗里显示的元素;

布局过程:

Scrollable,监听到用户滑动后,根据滑动偏移构建Viewport;

Viewport将当前视口信息和配置信息通过SliverConstraints传递给Sliver;

Sliver中对子组件按需进行构建和布局;

1.1Scrollable

用来处理滑动,确定偏移量,在滑动时构建Viewport。

Scrollable({
  ...
  this.axisDirection = AxisDirection.down,
  this.controller,
  this.physics,
  required this.viewportBuilder, //后面介绍
})

axisDirection,滚动方向;

controller,此属性接受一个ScrollController对象。ScrollController的主要作用是控制滚动位置和监听滚动事件;

physics,此属性接受一个ScrollPhysics类型的对象,决定可滚动组件如何响应用户操作;

viewportBuilder,构建 Viewport 的回调; 

1.2Viewport

用于渲染当前视口中需要显示 Sliver。

Viewport({
  Key? key,
  this.axisDirection = AxisDirection.down,
  this.crossAxisDirection,
  this.anchor = 0.0,
  required ViewportOffset offset, // 用户的滚动偏移
  // 类型为Key,表示从什么地方开始绘制,默认是第一个元素
  this.center,
  this.cacheExtent, // 预渲染区域
  //该参数用于配合解释cacheExtent的含义,也可以为主轴长度的乘数
  this.cacheExtentStyle = CacheExtentStyle.pixel, 
  this.clipBehavior = Clip.hardEdge,
  List<Widget> slivers = const <Widget>[], // 需要显示的 Sliver 列表
})

1.3Sliver

作用是对子组件进行构建和布局

2.1Scrollbar

Scrollbar是一个Material风格的滚动指示器(滚动条),如果要给可滚动组件添加滚动条,只需将Scrollbar作为可滚动组件的任意一个父级组件即可。

2.SingleChildScrollView

SingleChildScrollView类似于Android中的ScrollView,它只能接收一个子组件:

SingleChildScrollView({
  this.scrollDirection = Axis.vertical, //滚动方向,默认是垂直方向
  this.reverse = false, 
  this.padding, 
  bool primary, 
  this.physics, 
  this.controller,
  this.child,
})

primary,表示是否使用 widget 树中默认的PrimaryScrollController;当滑动方向为垂直方向(scrollDirection值为Axis.vertical)并且没有指定controller时,primary默认为true。

SingleChildScrollView不支持基于 Sliver 的延迟加载模型,所以如果超出屏幕的内容太多性能会很差,此时应该使用支持Sliver延迟加载的可滚动组件如ListView。 

String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return Scrollbar(
      child: SingleChildScrollView(
        child: Center(
          child: Column(
            children: str
                .split('')
                .map(
                  (item) => Text(
                    item,
                    textScaleFactor: 2,
                  ),
                )
                .toList(),
          ),
        ),
      ),
    );

效果:

 

 

举报

相关推荐

0 条评论