📅  最后修改于: 2021-01-02 05:30:04             🧑  作者: Mango
Sliver是可滚动区域的一部分,用于实现自定义滚动效果。换句话说,条状小部件是视口的一部分。我们可以使用条子实现所有可滚动视图,例如ListView,GridView。它是一个较低级的界面,可提供对实现可滚动区域的出色控制。在可滚动区域中滚动大量子窗口小部件时很有用。由于它们基于视口,因此它可以基于多个事件和偏移来更改其形状,大小和范围。
Flutter提供了几种棉条,其中一些如下:
请注意,所有条子的组件都应始终放置在CustomScrollView内。之后,我们可以合并条子列表以创建自定义可滚动区域。
Flutter中的CustomScrollView是一个滚动视图,允许我们创建各种滚动效果,例如网格,列表和扩展标题。它具有sliver属性,我们可以在其中传递小部件列表,包括SliverAppBar,SliverToBoxAdapter,SliverList和SliverGrid等。
让我们详细讨论每个条子。
SliverAppBar是Flutter中的材质设计应用程序栏,与CustomScrollView集成。通常,我们将其用作CustomScrollView的第一个子级。它的高度可以变化,并且可以浮动在滚动视图的其他小部件之上。它允许我们创建具有各种滚动效果的应用栏。
以下是SliverAppBar的基本属性:
操作:此属性用于在appBar标题的右侧创建窗口小部件。通常,它是代表常用操作的iconButton。
title:此属性用于定义SliverAppBar的标题。它类似于AppBar标题以提供应用程序的名称。
开头:此属性用于定义标题左侧的小部件。通常,它用于放置菜单抽屉小部件。
backgroundColor:此属性用于为条形应用程序栏定义背景颜色。
bottom:此属性用于在标题底部创建空间,我们可以根据需要在其中定义任何小部件。
ExpandedHeight:此属性用于指定滚动时可以扩展的应用栏的最大高度。必须以双精度值定义。
浮动:此属性确定当用户向应用程序栏滚动时,应用程序栏是否可见。
flexibleSpace:此属性用于定义堆叠在工具栏和选项卡栏后面的窗口小部件。它的高度与应用栏的整体高度相同。
在下面的示例中,我们将看到如何将SliverAppBar与CustomScrollView一起使用。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
actions: [
Icon(Icons.person, size: 40,)
],
title: Text("SliverAppBar Example"),
leading: Icon(Icons.menu),
backgroundColor: Colors.green,
expandedHeight: 100.0,
floating: true,
pinned: true
)
// Place sliver widgets here
],
),
),
);
}
}
输出量
当我们运行该应用程序时,我们应该获得与以下屏幕截图类似的屏幕UI:
SliverList是将子级放置在线性数组或一维数组中的条子。它需要一个委托参数才能以滚动到视图的方式在列表中提供项目。我们可以使用SliverChildListDelegate注明儿童的名单或用SliverChildBuilderDelegate建造它们。
在下面的示例中,我们将看到如何将SliverList与CustomScrollView一起使用。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
actions: [
Icon(Icons.person, size: 40,)
],
title: Text("SliverList Example"),
leading: Icon(Icons.menu),
backgroundColor: Colors.green,
expandedHeight: 100.0,
floating: true,
pinned: true
),
SliverList(
delegate: new SliverChildListDelegate(_buildList(20)),
),// Place sliver widgets here
],
),
),
);
}
}
List _buildList(int count) {
List listItems = List();
for (int i = 0; i < count; i++) {
listItems.add(new Padding(padding: new EdgeInsets.all(16.0),
child: new Text(
'Sliver Item ${i.toString()}',
style: new TextStyle(fontSize: 22.0)
)
));
}
return listItems;
}
输出量
当我们运行该应用程序时,我们应该获得与以下屏幕截图类似的屏幕UI:
SliverGrids将子级放置在二维排列中。它还使用委托来指定子项或类似于SliverList的显式列表。但是它具有网格上横轴尺寸的其他格式。它允许通过三种方式指定网格布局:
1.它使用Count构造函数对水平轴上的项目数进行计数。请参见以下代码:
SliverGrid.count(
crossAxisCount: 3,
mainAxisSpacing: 20.0,
crossAxisSpacing: 20.0,
childAspectRatio: 3.0,
children: [
Container(color: Colors.red),
Container(color: Colors.blue),
Container(color: Colors.green),
Container(color: Colors.red),
Container(color: Colors.blue),
Container(color: Colors.green),
],
),
2.它使用范围构造器,该构造器指定项目的最大宽度。当网格项目的大小不同时,此功能最为有用。这意味着我们可以限制它们应占用的空间。请参见以下代码:
SliverGrid.extent(
maxCrossAxisExtent: 200,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
children: [
Container(color: Colors.orange),
Container(color: Colors.yellow),
Container(color: Colors.purple),
Container(color: Colors.pink),
Container(color: Colors.green),
Container(color: Colors.indigo),
],
),
3.它使用默认构造函数,该构造函数在显式的gridDelegate参数中传递:
在下面的示例中,我们将看到如何将SliverGrid与CustomScrollView一起使用。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
actions: [
Icon(Icons.camera_front, size: 40,)
],
title: Text("SliverGrid Example"),
leading: Icon(Icons.menu),
backgroundColor: Colors.green,
expandedHeight: 100.0,
floating: true,
pinned: true
),
SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
) ,
delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
return new Container(
color: _randomPaint(index),
height: 150.0
);
}),
),
],
),
),
);
}
}
Color _randomPaint(int index) {
if (index % 3 == 0) {
return Colors.orange;
} else if (index % 3 == 1) {
return Colors.blue;
}
return Colors.red;
}
输出量
当我们运行该应用程序时,我们应该获得类似于以下屏幕截图的屏幕UI:
SliverFixedExtentList是一个条带,它以一维数组或线性数组容纳具有相同主轴范围的多个子级。它比SliverList效率更高,因为无需对其子级执行布局即可获取主轴范围。它不允许在其子级之间留有空隙。它要求每个孩子在横轴上都具有SliverConstraints.crossAxisExtent,在主轴上具有itemExtent属性。
SliverToBoxAdapter是只能容纳一个盒子小部件的条子。当我们只想在CustomScrollView中显示单个子窗口小部件以创建自定义滚动效果时,这很有用。如果需要在CustomScrollView中显示多个框小部件,则必须使用SliverList,SliverFixedExtentList或SliverGrid。
在下面的示例中,我们将看到如何将SliverFixedExtentList和SliverToBoxAdapter与CustomScrollView一起使用。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
actions: [
Icon(Icons.camera_front, size: 40,)
],
title: Text("Sliver Example"),
leading: Icon(Icons.menu),
backgroundColor: Colors.green,
expandedHeight: 100.0,
floating: true,
pinned: true
),
SliverFixedExtentList(
itemExtent: 75,
delegate: SliverChildListDelegate([
Container(color: Colors.blue),
Container(color: Colors.pink),
Container(color: Colors.yellow),
]),
),
SliverToBoxAdapter(
child: Container(
color: Colors.orange,
padding: const EdgeInsets.all(16.0),
child: Text('Sliver Grid Header', style: TextStyle(fontSize: 28)),
),
),
],
),
),
);
}
}
输出量
当我们运行该应用程序时,我们应该获得与以下屏幕截图类似的屏幕UI: