博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter 28: 图解 ListView/GridView 混用时滑动冲突小尝试
阅读量:6403 次
发布时间:2019-06-23

本文共 5112 字,大约阅读时间需要 17 分钟。

      小菜在学习过程中会在一个 Page 页面同时用到 GridView 和 ListView 或多个 ListView,此时就会遇到常见的滑动冲突问题。小菜尝试了两种解决滑动冲突的方案,仅记录一下基本的使用方式。小菜翻译很不到位,可重点看代码。

尝试一:CustomScrollView + sliver

      Flutter 提供了类似于 Android CollapsingToolbarLayout 的折叠效果,小菜借此了解到 CustomScrollView 这个组件,可以解决列表的滑动冲突。

       允许包含多种滚动模型,例如列表/网格和扩展标题。但其子 Widget 必须为 sliver 类型的。

       代表具有特定滚动效果的滚动模型,sliver 本身不包含滚动交互模型,需要通过 CustomScrollView 连接为一个整体。sliver 有众多具体的 Widget,小菜也在尝试过程中。

class _ScrollPageState extends State
{ List
gridData = List
(); _setGridData() { for (int i = 0; i < 15; i++) { gridData.add(i); } } @override void initState() { _setGridData(); } @override Widget build(BuildContext context) { return Scaffold(appBar: AppBar(title: Text('方案一')), body: _bodyWid()); } Widget _bodyWid() { return CustomScrollView(slivers:
[ SliverList( delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return _typeTitleWid('热门分类'); }, childCount: 1)), SliverPadding(padding: const EdgeInsets.all(8.0), sliver: _typeGridWid()), SliverList( delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return _typeTitleWid('智能推荐'); }, childCount: 1)), _typeListWid() ]); } Widget _typeTitleWid(var titleStr) { return Container( color: Colors.white, child: Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children:
[ Padding( padding: EdgeInsets.all(10.0), child: Text(titleStr, style: TextStyle(color: Color(0xFF808080), fontSize: 14.0))), Divider(color: Color(0xFF808080), height: 0.5) ])); } Widget _typeGridWid() { return SliverGrid( gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 4, mainAxisSpacing: 8.0, crossAxisSpacing: 8.0, childAspectRatio: 4.0), delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return Container( height: 64.0, decoration: BoxDecoration( color: Colors.grey, borderRadius: BorderRadius.circular(3.0)), child: Center( child: Text('分类 ${(index + 1)}', style: TextStyle(color: Color(0xFF333333), fontSize: 14.0)))); }, childCount: gridData.length)); } Widget _typeListWid() { return SliverFixedExtentList( itemExtent: 50.0, delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return Container( child: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children:
[ Padding( padding: EdgeInsets.all(10.0), child: Text('推荐精彩内容 ${(index + 1)}', textAlign: TextAlign.left, style: TextStyle( color: Color(0xFF333333), fontSize: 15.0))), Padding( padding: EdgeInsets.only(top: 4.0), child: Divider(color: Color(0xFF808080), height: 0.5)) ])); }, childCount: gridData.length)); }}

尝试二:primary + shrinkWrap

      小菜在使用 ListViewGridView 时发现有两个属性很重要。小菜的翻译很不到位,建议大家仔细阅读一下官网的介绍。

       常用于内容大小不确定情况,如果滚动视图(ListView/GridView/ScrollView 等)没有收缩包装,则滚动视图将扩展到允许的最大大小。如果是无界约束,则 shrinkWrap 必须为 true

       如果为 true,即使滚动视图没有足够的内容来支撑滚动,滚动视图也是可滚动的。否则,默认为 false 情况下,只有具有足够内容的用户才能滚动视图。

class _ScrollPageState extends State
{ @override Widget build(BuildContext context) { return Scaffold(appBar: AppBar(title: Text('方案二')), body: _bodyWid2()); } Widget _typeGridWid2() { return GridView.count( primary: false, shrinkWrap: true, crossAxisCount: 4, mainAxisSpacing: 8.0, crossAxisSpacing: 8.0, childAspectRatio: 4.0, padding: EdgeInsets.all(10.0), children: gridData.map((int index) { return Container( height: 64.0, decoration: BoxDecoration( color: Colors.grey, borderRadius: BorderRadius.circular(3.0)), child: Center( child: Text('分类 ${(index + 1)}', style: TextStyle( color: Color(0xFF333333), fontSize: 14.0)))); }).toList()); } Widget _typeListWid2() { return ListView.separated( primary: false, shrinkWrap: true, itemCount: gridData.length, separatorBuilder: (BuildContext context, int index) => new Divider(), itemBuilder: (context, item) { return Padding( padding: EdgeInsets.all(12.0), child: Text('推荐精彩内容 ${(item + 1)}', style: TextStyle(color: Color(0xFF333333), fontSize: 15.0))); }); } Widget _bodyWid2() { return ListView(children:
[ _typeTitleWid('热门分类'), _typeGridWid2(), _typeTitleWid('智能推荐'), _typeListWid2() ]); }}

      小菜的学习还很不到位,如果有不对的地方还希望多多指出!

转载地址:http://penea.baihongyu.com/

你可能感兴趣的文章
解决谷歌被封 打不开
查看>>
nginx + uwsgi 部署
查看>>
Why Blog
查看>>
阅读源码时候的技巧
查看>>
ios push界面怎么拿到push前的界面和push后的界面
查看>>
恢复被误删除的oracle数据文件(一)
查看>>
【oracle】系统权限、对象权限、角色
查看>>
Linux 系统启动流程详解
查看>>
Nginx_PHP配置文件结构设计
查看>>
6421B Lab12 控制和监视网络存储
查看>>
gleez常用汇总数据sql
查看>>
DHCP服务器安装及配置案例
查看>>
2.1Linux系统基础入门
查看>>
设计模式之结构型模式—— 2.7 代理模式
查看>>
新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路
查看>>
Ext工具栏Toolbar
查看>>
grep命令
查看>>
hive 行转列
查看>>
我的友情链接
查看>>
centos下 MySQL 5.5.13 CMake 安装笔记
查看>>