Flutter 单击“网格元素”以显示更多元素颤振
我有一个联系人列表,不知道如何将前5个和第6ed元素显示为“showmore”元素,单击该元素将显示其余联系人。 我正在寻找有关如何实现此UI功能的建议:Flutter 单击“网格元素”以显示更多元素颤振,flutter,gridview,Flutter,Gridview,我有一个联系人列表,不知道如何将前5个和第6ed元素显示为“showmore”元素,单击该元素将显示其余联系人。 我正在寻找有关如何实现此UI功能的建议: 解决方案: import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class Contact { final String name; Contact(this.name); } class ContactsPage exte
解决方案:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class Contact {
final String name;
Contact(this.name);
}
class ContactsPage extends StatefulWidget {
@override
_ContactsPageState createState() => _ContactsPageState();
}
class _ContactsPageState extends State<ContactsPage> {
final contacts = [
Contact("sahar"),
Contact("Joe"),
Contact("fo"),
Contact("Fifo"),
Contact("Moshe"),
];
var _displayAll = false;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("contacts"),),
backgroundColor: Colors.white,
body: Center(
child:_gridContacts(),
),
);
}
Widget _gridContacts() {
final size = _displayAll ? contacts.length : contacts.length - 2;
final contactsWidget = List.generate(
size, (index) => _contactItem(contacts[index]))
..add(_seeNoSeeMore());
return GridView.count(
crossAxisCount: 3,
childAspectRatio: 2/1,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
children: contactsWidget,);
}
Widget _contactItem(Contact item) {
return Container(
color: Colors.blue.withOpacity(0.5),
padding: EdgeInsets.all(5),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.person),
Text(item.name),
],
),
);
}
Widget _seeNoSeeMore() {
return InkWell(
onTap: ()=>setState(()=>_displayAll = !_displayAll),
child: Container(
color: Colors.blue.withOpacity(0.5),
padding: EdgeInsets.all(5),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.person),
Text(_displayAll?"hide":"Show all"),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
班级联系{
最后的字符串名;
联系人(姓名);
}
类ContactsPage扩展StatefulWidget{
@凌驾
_ContactsPageState createState()=>_ContactsPageState();
}
类_ContactsPageState扩展状态{
最终联系人=[
联系人(“sahar”),
联络人(“乔”),
联络人(“fo”),
联系方式(“Fifo”),
联系人(“Moshe”),
];
var _displayAll=false;
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“联系人”),),
背景颜色:Colors.white,
正文:中(
子项:_gridContacts(),
),
);
}
Widget_gridContacts(){
最终尺寸=_displayAll?contacts.length:contacts.length-2;
最终联系人widget=List.generate(
大小,(索引)=>\u联系人项目(联系人[索引])
…添加(_seenosemore());
返回GridView.count(
交叉轴计数:3,
儿童方面:2/1,
横轴间距:10,
平均间距:10,
儿童:contactsWidget,);
}
小部件\u联系人项目(联系人项目){
返回容器(
颜色:颜色。蓝色。不透明度(0.5),
填充:边缘设置。全部(5),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
mainAxisSize:mainAxisSize.min,
儿童:[
图标(Icons.person),
文本(项目名称),
],
),
);
}
小部件_seenosemore(){
回墨槽(
onTap:()=>设置状态(()=>\u displayAll=!\u displayAll),
子:容器(
颜色:颜色。蓝色。不透明度(0.5),
填充:边缘设置。全部(5),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
mainAxisSize:mainAxisSize.min,
儿童:[
图标(Icons.person),
文本(_displayAll?“hide”:“Show all”),
],
),
),
);
}
}
注意:为了获得更好的性能,请不要使用setState,而应使用状态管理或本机的one streambuilder。这非常有效!!非常感谢你