Flutter 单击“网格元素”以显示更多元素颤振

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

我有一个联系人列表,不知道如何将前5个和第6ed元素显示为“showmore”元素,单击该元素将显示其余联系人。 我正在寻找有关如何实现此UI功能的建议:

解决方案:

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。

这非常有效!!非常感谢你