Flutter GridView 与 Header
Flutter GridView with Header
如何在 FLUTTER 中创建带有可滚动工具栏的网格视图。我找到了 header ListViewWithHeader 的列表视图。但是我需要带有 header 的 GridView,就像在提到的图像 below.I 中使用了 SilverGrid 忽略器来构建这个布局,这有点滞后。所以我需要另一个选择。
Container setDataToContainer() {
return Container(
color: Colors.white,
margin: EdgeInsets.only(left: 4.0, right: 4, bottom: 4, top: 4),
child: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Header 1"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title", "key_x", "pnl.svg"),
BodyWidget("title2", "key_x", "cls.svg"),
BodyWidget(
"title3", "key_x", "irr.svg"),
BodyWidget(
"title4", "key_x", "icp.svg"),
],
),
),
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Header 2"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title5", "key_x", "ict.svg"),
BodyWidget("title6", "key_x", "icc.svg"),
],
),
),
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Others"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title7", "key_x", "icd.svg"),
BodyWidget("title8", "6", "ici.svg"),
],
),
),
],
),
);
}
class HeaderWidget extends StatelessWidget {
final String text;
HeaderWidget(this.text);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(left: 10.0, right: 10, bottom: 2, top: 20),
child: Text(
text.toUpperCase(),
style: TextStyle(
color: hexToColor(themeColor1),
fontSize: 16,
fontWeight: FontWeight.bold),
),
color: Colors.white,
);
}
}
class BodyWidget extends StatelessWidget {
final String imagePath;
final String title;
final String navigationKey;
BodyWidget(this.title, this.navigationKey, this.imagePath);
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
child: Card(
color: hexToColor(themeColor1),
elevation: 5,
child: InkWell(
onTap: () {
navigateToView(context, navigationKey);
},
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.topCenter,
child: Container(
margin: EdgeInsets.only(top: 40),
child: SvgPicture.asset(
"assets/images/$imagePath",
color: Colors.white,
width: 35,
height: 35,
),
),
),
Align(
alignment: Alignment.bottomCenter,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
verticalDirection: VerticalDirection.up,
children: <Widget>[
Container(
padding: EdgeInsets.all(10),
color: Colors.black.withOpacity(.2),
child: Text(
title,
style: TextStyle(
color: Colors.white,
fontSize: 14,
fontWeight: FontWeight.normal),
),
)
],
),
),
],
),
),
));
}
void navigateToView(BuildContext context, String navigationKey) {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) {
return NewSections();
},
transitionsBuilder: (context, animation1, animation2, child) {
return FadeTransition(
opacity: animation1,
child: child,
);
},
transitionDuration: Duration(milliseconds: 600),
),
);
}
}
您可以尝试使用此代码代替 SliverGrid
sticky_headers: ^0.1.7
将以上插件加入pubspec.yaml
import 'package:flutter/material.dart';
import 'package:sticky_headers/sticky_headers.dart';
class GridHeader extends StatefulWidget {
@override
_GridHeaderState createState() => _GridHeaderState();
}
class _GridHeaderState extends State<GridHeader> {
List<String> listHeader = ['HEADER1','HEADER2','HEADER3','HEADER4','HEADER5','HEADER6','HEADER7','HEADER8','HEADER9','HEADER10',];
List<String> listTitle = ['title1','title2','title3','title4',];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Grid Header Demo"),
),
body: gridHeader(),
);
}
Widget gridHeader(){
return new ListView.builder(itemCount: listHeader.length,itemBuilder: (context, index) {
return new StickyHeader(
header: new Container(
height: 38.0,
color: Colors.white,
padding: new EdgeInsets.symmetric(horizontal: 12.0),
alignment: Alignment.centerLeft,
child: new Text(listHeader[index],
style: const TextStyle(color: Colors.purple, fontSize: 20,fontWeight: FontWeight.bold),
),
),
content: Container(
child: GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: listTitle.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,childAspectRatio: 1,),
itemBuilder: (contxt, indx){
return Card(
margin: EdgeInsets.all(4.0),
color: Colors.purpleAccent,
child: Padding(
padding: const EdgeInsets.only(left: 12.0, top: 6.0, bottom: 2.0),
child: Center(child: Text(listTitle[indx], style: TextStyle(fontSize: 14, color: Colors.black54),)),
),
);
},
),
),
);
},
shrinkWrap: true,
);
}
}
根据您的要求更改您的 listHeader
和 listTitle
数据
如何在 FLUTTER 中创建带有可滚动工具栏的网格视图。我找到了 header ListViewWithHeader 的列表视图。但是我需要带有 header 的 GridView,就像在提到的图像 below.I 中使用了 SilverGrid 忽略器来构建这个布局,这有点滞后。所以我需要另一个选择。
Container setDataToContainer() {
return Container(
color: Colors.white,
margin: EdgeInsets.only(left: 4.0, right: 4, bottom: 4, top: 4),
child: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Header 1"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title", "key_x", "pnl.svg"),
BodyWidget("title2", "key_x", "cls.svg"),
BodyWidget(
"title3", "key_x", "irr.svg"),
BodyWidget(
"title4", "key_x", "icp.svg"),
],
),
),
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Header 2"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title5", "key_x", "ict.svg"),
BodyWidget("title6", "key_x", "icc.svg"),
],
),
),
SliverList(
delegate: SliverChildListDelegate(
[
HeaderWidget("Others"),
],
),
),
SliverGrid(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
delegate: SliverChildListDelegate(
[
BodyWidget("title7", "key_x", "icd.svg"),
BodyWidget("title8", "6", "ici.svg"),
],
),
),
],
),
);
}
class HeaderWidget extends StatelessWidget {
final String text;
HeaderWidget(this.text);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(left: 10.0, right: 10, bottom: 2, top: 20),
child: Text(
text.toUpperCase(),
style: TextStyle(
color: hexToColor(themeColor1),
fontSize: 16,
fontWeight: FontWeight.bold),
),
color: Colors.white,
);
}
}
class BodyWidget extends StatelessWidget {
final String imagePath;
final String title;
final String navigationKey;
BodyWidget(this.title, this.navigationKey, this.imagePath);
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
child: Card(
color: hexToColor(themeColor1),
elevation: 5,
child: InkWell(
onTap: () {
navigateToView(context, navigationKey);
},
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.topCenter,
child: Container(
margin: EdgeInsets.only(top: 40),
child: SvgPicture.asset(
"assets/images/$imagePath",
color: Colors.white,
width: 35,
height: 35,
),
),
),
Align(
alignment: Alignment.bottomCenter,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
verticalDirection: VerticalDirection.up,
children: <Widget>[
Container(
padding: EdgeInsets.all(10),
color: Colors.black.withOpacity(.2),
child: Text(
title,
style: TextStyle(
color: Colors.white,
fontSize: 14,
fontWeight: FontWeight.normal),
),
)
],
),
),
],
),
),
));
}
void navigateToView(BuildContext context, String navigationKey) {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation1, animation2) {
return NewSections();
},
transitionsBuilder: (context, animation1, animation2, child) {
return FadeTransition(
opacity: animation1,
child: child,
);
},
transitionDuration: Duration(milliseconds: 600),
),
);
}
}
您可以尝试使用此代码代替 SliverGrid
sticky_headers: ^0.1.7
将以上插件加入pubspec.yaml
import 'package:flutter/material.dart';
import 'package:sticky_headers/sticky_headers.dart';
class GridHeader extends StatefulWidget {
@override
_GridHeaderState createState() => _GridHeaderState();
}
class _GridHeaderState extends State<GridHeader> {
List<String> listHeader = ['HEADER1','HEADER2','HEADER3','HEADER4','HEADER5','HEADER6','HEADER7','HEADER8','HEADER9','HEADER10',];
List<String> listTitle = ['title1','title2','title3','title4',];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Grid Header Demo"),
),
body: gridHeader(),
);
}
Widget gridHeader(){
return new ListView.builder(itemCount: listHeader.length,itemBuilder: (context, index) {
return new StickyHeader(
header: new Container(
height: 38.0,
color: Colors.white,
padding: new EdgeInsets.symmetric(horizontal: 12.0),
alignment: Alignment.centerLeft,
child: new Text(listHeader[index],
style: const TextStyle(color: Colors.purple, fontSize: 20,fontWeight: FontWeight.bold),
),
),
content: Container(
child: GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: listTitle.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,childAspectRatio: 1,),
itemBuilder: (contxt, indx){
return Card(
margin: EdgeInsets.all(4.0),
color: Colors.purpleAccent,
child: Padding(
padding: const EdgeInsets.only(left: 12.0, top: 6.0, bottom: 2.0),
child: Center(child: Text(listTitle[indx], style: TextStyle(fontSize: 14, color: Colors.black54),)),
),
);
},
),
),
);
},
shrinkWrap: true,
);
}
}
根据您的要求更改您的 listHeader
和 listTitle
数据