当前位置: 首页 > news >正文

Flutter(四):SingleChildScrollView、GridView

SingleChildScrollView、GridView 遇到的问题

以下代码会报错:

在这里插入图片描述

class GridViewPage extends StatefulWidget {const GridViewPage({super.key});State<GridViewPage> createState() => _GridViewPage();
}class _GridViewPage extends State<GridViewPage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('GridView 布局')),body: SingleChildScrollView(child: GridView.count(crossAxisCount: 1,children: [Container(color: Colors.red),Container(color: Colors.green),Container(color: Colors.blue),Container(color: Colors.black),Container(color: Colors.grey),],),),);}
}

修改方案一

在这里插入图片描述

存在问题:给定一个高度的方法虽然能解决报错问题,但是滚动区域会固定在所给高度内,无法自适应高度

class GridViewPage extends StatefulWidget {const GridViewPage({super.key});State<GridViewPage> createState() => _GridViewPage();
}class _GridViewPage extends State<GridViewPage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('GridView 布局')),body: SizedBox(height: 500,child: GridView.count(crossAxisCount: 1,children: [Container(color: Colors.red),Container(color: Colors.green),Container(color: Colors.blue),Container(color: Colors.black),Container(color: Colors.grey),],),),);}
}

修改方案二

在这里插入图片描述

存在问题:页面不能滚动

shrinkWrap: true: 自适应GridView高度

class GridViewPage extends StatefulWidget {const GridViewPage({super.key});State<GridViewPage> createState() => _GridViewPage();
}class _GridViewPage extends State<GridViewPage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('GridView 布局')),body: SingleChildScrollView(child: GridView.count(crossAxisCount: 1,shrinkWrap: true,children: [Container(color: Colors.red),Container(color: Colors.green),Container(color: Colors.blue),Container(color: Colors.black),Container(color: Colors.grey),],),),);}
}

解决页面不能滚动问题

在这里插入图片描述

physics: const NeverScrollableScrollPhysics(): 禁用GridView自带的滚动

class GridViewPage extends StatefulWidget {const GridViewPage({super.key});State<GridViewPage> createState() => _GridViewPage();
}class _GridViewPage extends State<GridViewPage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('GridView 布局')),body: SingleChildScrollView(child: GridView.count(crossAxisCount: 1,shrinkWrap: true,physics: const NeverScrollableScrollPhysics(),children: [Container(color: Colors.red),Container(color: Colors.green),Container(color: Colors.blue),Container(color: Colors.black),Container(color: Colors.grey),],),),);}
}

实现 GridView 布局

在这里插入图片描述

属性描述
shrinkWrap自适应宽高
scrollDirection布局方向
childAspectRatio主轴、交叉轴 比
mainAxisSpacing主轴间距
crossAxisSpacing交叉轴间距
crossAxisCount交叉轴列数
maxCrossAxisExtent交叉轴列最尺寸
import 'package:flutter/material.dart';class TitleWidget extends StatelessWidget {final String title;const TitleWidget(this.title, {super.key});Widget build(BuildContext context) {return Container(margin: const EdgeInsets.fromLTRB(10, 5, 10, 5),padding: const EdgeInsets.only(left: 5),decoration: const BoxDecoration(border: Border(left: BorderSide(color: Colors.lightBlue, width: 5)),),child: Text(title),);}
}class ContainerWidget extends StatelessWidget {final Color color;final String title;const ContainerWidget({super.key, required this.color, required this.title});Widget build(BuildContext context) {return Container(decoration: BoxDecoration(color: color,borderRadius: const BorderRadius.all(Radius.circular(5)),),child: Center(child: Text(title)),);}
}class GridViewPage extends StatefulWidget {const GridViewPage({super.key});State<GridViewPage> createState() => _GridViewPage();
}class _GridViewPage extends State<GridViewPage> {List<ContainerWidget> containerWidgetList = const [ContainerWidget(color: Colors.red, title: 'RED'),ContainerWidget(color: Colors.orange, title: 'ORANGE'),ContainerWidget(color: Colors.yellow, title: 'YELLOW'),ContainerWidget(color: Colors.green, title: 'GREEN'),ContainerWidget(color: Colors.cyan, title: 'CYAN'),ContainerWidget(color: Colors.blue, title: 'BLUE'),ContainerWidget(color: Colors.purple, title: 'PURPLE'),ContainerWidget(color: Colors.grey, title: 'GREY'),];Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('GridView 布局')),body: SingleChildScrollView(child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [const TitleWidget('GridView.count'),SizedBox(height: 160,child: GridView.count(scrollDirection: Axis.horizontal,crossAxisCount: 1,padding: const EdgeInsets.only(left: 10, right: 10),crossAxisSpacing: 0,mainAxisSpacing: 10,childAspectRatio: 0.6,children: containerWidgetList,),),const TitleWidget('GridView.extent'),GridView.extent(shrinkWrap: true,physics: const NeverScrollableScrollPhysics(),scrollDirection: Axis.vertical,maxCrossAxisExtent: 200,childAspectRatio: 0.8,padding: const EdgeInsets.only(left: 10, right: 10),mainAxisSpacing: 10,crossAxisSpacing: 10,children: containerWidgetList,),const TitleWidget('SliverGridDelegateWithFixedCrossAxisCount'),SizedBox(height: 330,child: GridView(gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,crossAxisSpacing: 10,mainAxisSpacing: 10,childAspectRatio: 0.6,),scrollDirection: Axis.horizontal,padding: const EdgeInsets.only(left: 10, right: 10),children: containerWidgetList,),),const TitleWidget('SliverGridDelegateWithMaxCrossAxisExtent'),GridView(gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 200,childAspectRatio: 2,mainAxisSpacing: 10,crossAxisSpacing: 10,),shrinkWrap: true,physics: const NeverScrollableScrollPhysics(),scrollDirection: Axis.vertical,padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),children: containerWidgetList,),],),),);}
}
http://www.lryc.cn/news/312448.html

相关文章:

  • 【C++】102.二叉树的层序遍历
  • Java学习笔记006——子类与父类的类型转换
  • FedAsync Asynchronous Federated Optimization
  • 学习基于 JavaScript 语言 的计算机界三大神书”之一 ——SICP
  • 【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型
  • K8s 镜像缓存管理 kube-fledged 认知
  • ModbusTcp协议
  • 常用工具——Gradle
  • OpenHarmony教程指南—Navigation开发 页面切换场景范例
  • 2024-简单点-picamera2除了文档还有哪里可以学习实例?
  • JavaScript实现点击鼠标弹钢琴的效果
  • docker-compose Install rustdesk
  • 初学C++
  • 数据分析-Pandas数据y轴双坐标设置
  • Android多线程实现方式及并发与同步,Android面试题汇总
  • 2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…
  • 设计MySQL数据表的几个注意点
  • android 键盘遮挡输入框问题回忆
  • ZJGSU 1737 链表
  • Java开发人员不得不收集的代码,java软件开发面试常见问题
  • 浅谈块存储、文件存储、对象存储
  • 2024年 Python面试热点
  • Map集合体系——遍历,HashMap,TreeMap,LikedHashMap
  • docker mysql主从复制
  • iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践
  • Redis的事务
  • 4.2 比多数opencv函数效果更好的二值化(python)
  • webpack打包一个文件,做了哪些事情
  • 设计模式学习笔记 - 设计原则 - 6.KISS原则和YAGNI原则
  • 【Vue3-vite】动态导入路由