前言

日常的开发工作中,经常会遇到列表中嵌套ListView的需求。具体情况也分为两种。

1.竖向ListView嵌套横向ListView

常见的需求:竖向ListView行数不限制,横向ListView的列数不限制。具体情况如下图。

代码如下:

L i s t V i e w ( c ] h , i T S ) l e t , d x a c ] r t c h , e ( k i I ) S P ) n ' ( l g , i o , : L d n c ) z s c ) i r o h , e i h , [ s e r i o c d t i s i t n e l p h B i l c t V : P d a i o o d r e i o : c l x n : o m e [ i i d ( e l B w n O t : w d L l u ' t p y i . i D i ) e a : I d f s i l , r c t t i t r d ( i 0 e h l V e e t . m : l i c r y 0 ( ( e t : ( , ) d w i , o . o u b n _ b u : , l i e l A i . d x n i e i d n r s e f ( . x i h ) n o i r = t i > y z ) o I , n t t e a m l ( , ) ,

Stack存在无Positioned包裹的子组件,决定Stack尺寸的是无位置的组件中的最大的尺寸,Positioned不会影响Stack的尺寸。(当然如果子类全部是Positioned包裹的子组件,Stack会将自身尺寸设置为父级布局约束所允许的最大尺寸,为对齐子组件创造条件。)。 此处用Positioned.fill,让ListView尽量占满整个Stack。 接下来设置宽度,利用SizedBox的向下传递约束,向上传递尺寸的特性。用SizedBox(width: double.infinity)把宽度撑开到整个屏幕的宽度。 接下来算出Item的高度,用Item的高度撑开Stack的高度。 此处用Item的初衷只是为了定制高度,不能让Item显示在屏幕上,所以用Opacity隐藏Item,为了忽略掉事件响应,最后用上IgnorePointer

2.竖向ListView嵌套竖向ListView

这类需求是由于父列表和子列表的行数都不确定。处理也比较简单。

L i s t V i e p w h ( y s c i ] h c , i T L s l e i : d x s r t t N e ( V e n ' i v : L e e ) i w r , [ s . s S i t b h c t V u r r e i i i o m e l n l B w d k l u ' e W a i ) r r b l , ( a l d p e e : S r c : t r r o u l _ e l , , P h i y n s d i e c x s ) ( ) = , > I t e m ( ) ,

通过设置shrinkWrap来固定ListView的高度,禁用滑动事件,让外面的ListView响应滑动事件就行了。 需要注意的是使用shrinkWrap,会一次性加载出所有的Item。如果数量太多,会出现内存问题。这时候可以通过父ListView和子ListView共用一个ScrollController来解决。代码如下:

S c r L o i l s c ] l t o , C V n c o i t h n e r i t w o l r ( l d L ) o l r i , l e e s l r n t e : : V r i _ [ e c _ s w o s c ( n c r t r o r o l o l l l l C l C o e o n r n t : t r _ r o s o l c l l r l e o e r l r , l ; C o n t r o l l e r ,