1- ListView的使用
在文档中我们可以看到ListView有 几种创建方式
1.1公用的方式
//导入风格样式库
import 'package:flutter/material.dart';
//main函数
main() =>runApp(MyApp());
//MyApp类继承StatelessWidget
class MyApp extends StatelessWidget {
//重写方法
@override
Widget build(BuildContext context) {
return MaterialApp(
home: JCHome() ,
);
}
}
class JCHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
//创建一个控制器
return Scaffold(
appBar:AppBar(
title: Text(
"Flutter Demo",
style: TextStyle(
fontSize: 20,
),
),
) ,
body: JCHomePage(),
);
}
}
class JCHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
//这里可以调用不同的创建方式
return creatListDefault1();
}
}
1.3ListView的默认创建方式
定义一个函数,listView默认创建方式
ListView creatListDefault1() {
return ListView(
children: List.generate(100, (index){
return ListTile(
leading: Icon(Icons.people),
trailing: Icon(Icons.delete),
title: Text(
"联系人${index + 1}",
),
subtitle: Text(
"电话:18677768954"
),
);
})
);
}
默认创建方式2
ListView getListViewDemo1(){
ListView(
children: <Widget>[
Row(
children: <Widget>[
Icon(Icons.face,color: Colors.red,),
Text(
"这是一个脸谱",
style: TextStyle(
fontSize: 20,
),
),
],
),
],
);
}
1.4 builder创建ListView
//创建方式2
class ListViewDemo2 extends StatelessWidget{
@override
Widget build(BuildContext context) {
// TODO: implement build
return ListView.builder(
//item个数
itemCount:100 ,
//item的高度
itemExtent:60 ,
itemBuilder: (BuildContext ctx, int index){
return Text("Hellow Word -- $index",
style: TextStyle(
fontSize: 20,
color: Colors.red
),
);
}
);
}
}
1.5 separated分割线的创建方式
class ListViewDemo3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return ListView.separated(
itemCount: 100,
//创建cell
itemBuilder: (BuildContext ctx, int index){
return Text("测试--$index",
style: TextStyle(
fontSize: 20,
),
);
},
//分割线
separatorBuilder: (BuildContext ctx,int index){
return Divider(
color: Colors.red,
);
},
);
}
}
2-GridView几何视图
import 'dart:math';
import 'package:flutter/material.dart';
main() =>runApp(MyApp());
class MyApp extends StatelessWidget {
//重写方法
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: JCHome() ,
);
}
}
class JCHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
//创建一个控制器
return Scaffold(
appBar:AppBar(
title: Text(
"Flutter Demo",
style: TextStyle(
fontSize: 20,
),
),
) ,
body: JCHomePage(),
);
}
}
class JCHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
//调用不同的创建方式
return creatGridViewThress();
}
}
2.1 默认创建GridView的方式
SliverGridDelegateWithFixedCrossAxisCount 固定交叉轴的 个数
//默认创建GridView的方式
Padding getGridViewDefault () {
return Padding(
padding: const EdgeInsets.all(8.0),
child: GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
//宽度和高度的比例 是0.8
childAspectRatio: .8,
),
children: List.generate(100, (index){
return Container(
color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
);
})
),
);
}
2.2 builder创建方式
SliverGridDelegateWithMaxCrossAxisExtent
GridView creatGridViewTwoMethod (){
return GridView.builder(
//代理方式
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
itemBuilder: (BuildContext context,int index){
return Container(
color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
);
}
);
}
SliverGridDelegateWithFixedCrossAxisCount
GridView creatGridViewThress() {
return GridView.builder(
//固定交叉轴上item的个数
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
//宽度和高度的比例 是0.8
childAspectRatio: .8,
),
itemBuilder: (BuildContext context,int index){
return Container(
color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
);
}
);
}
3. CustomScrollView
上面的ListView和GridView都可以通过 CustomScrollView的上市创建
ListView为例子看一下里面实现的源码
ListView继承BoxScrollView,
BoxScrollView继承 ScrollView
ScrollView继承StatelessWidget
通过查看ScrollView的build方法
是没有实现的方法(抽象类方法)
@protected List<Widget> buildSlivers(BuildContext context);
他的子类会实现, BoxScrollView
在BoxScrollView中实现,中我们发现
buildChildLayout 方法 也是一个抽象类方法,需要其子类实现(ListView 和 GridView)
ListView的实现
GridView的实现
3.1 CustomScrollView 中的 Sliver
CustomScrollView有一个slivers属性,里面让我们放对应的一些Sliver:
- SliverList:类似于我们之前使用过的ListView;
- SliverFixedExtentList:类似于SliverList只是可以设置滚动的高度;
- SliverGrid:类似于我们之前使用过的GridView;
- SliverPadding:设置Sliver的内边距,因为可能要单独给Sliver设置内边距;
- SliverAppBar:添加一个AppBar,通常用来作为-CustomScrollView的HeaderView;
- SliverSafeArea:设置内容显示在安全区域
import 'dart:math';
import 'package:flutter/material.dart';
main() =>runApp(MyApp());
class MyApp extends StatelessWidget {
//重写方法
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: JCHome() ,
);
}
}
class JCHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
//创建一个控制器
return Scaffold(
// appBar:AppBar(
// title: Text(
// "Flutter Demo",
// style: TextStyle(
// fontSize: 20,
// ),
// ),
//
// ) ,
body: JCHomePage(),
);
}
}
class JCHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return creatSliverList();
}
}
CustomScrollView creatSliverList (){
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
//固定导航条
pinned: true,
title: Text(
"自定义的导航条"
),
// 头部View的高度
expandedHeight: 300,
flexibleSpace: FlexibleSpaceBar(
background: Image(
image: AssetImage("resource/images/11.jpg"),
fit: BoxFit.fill,
),
collapseMode: CollapseMode.pin,
stretchModes:[StretchMode.blurBackground]
),
),
//集合视图sliver的Sliver
SliverGrid(
delegate: SliverChildBuilderDelegate(
(BuildContext ctx, int index){
return Container(color: Color.fromARGB(255, Random().nextInt(
256), Random().nextInt(256), Random().nextInt(256)));
},
childCount: 60,
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8
),
),
//listView
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext ctx, int index){
return ListTile(
leading: Icon(Icons.people),
title: Text("联系人 ${index}"),
);
},
childCount: 50,
),
),
],
);
}
CustomScrollView creatGridViewWithSliver(){
return CustomScrollView(
slivers: <Widget>[
//安全区域
SliverSafeArea(
//安全padding
sliver: SliverPadding(
padding: EdgeInsets.all(8),
sliver: SliverGrid(
delegate:SliverChildBuilderDelegate(
(BuildContext context, int index){
return Container(color: Color.fromARGB(255, Random().nextInt(
256), Random().nextInt(256), Random().nextInt(256)));
},
childCount: 100,
) ,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8,
mainAxisSpacing: 8
),
),
),
)
],
);
}