在颤动的页面上同时使用水平和垂直 listview.builder

Posted

技术标签:

【中文标题】在颤动的页面上同时使用水平和垂直 listview.builder【英文标题】:Using both horizontal and vertical listview.builder on a page in flutter 【发布时间】:2021-11-03 09:53:55 【问题描述】:

在我的应用程序中,我想在主屏幕上水平和垂直显示两种不同的产品。但我想用 ListView.Builder 来做这件事,因为它们都是列表。我找不到这个的正确用法,你能帮忙吗?

SingleChildScrollView(
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: <Widget>[
                        SizedBox(
                          height: 200.0,
                          child: ListView.builder(
                            physics: ClampingScrollPhysics(),
                            shrinkWrap: true,
                            scrollDirection: Axis.horizontal,
                            itemCount: 25,
                            itemBuilder: (BuildContext context, int index) =>
                                Card(
                              child: Center(child: Text('Horizontal List Child')),
                            ),
                          ),
                        ),
                        ListView.builder(
                          itemCount: 10,
                          shrinkWrap: true,
                          scrollDirection: Axis.vertical,
                          itemBuilder: (context, index) 
                            return Expanded(
                              child: Card(
                                  child:
                                      Center(child: Text('Vertical List Child'))),
                            );
                          ,
                        )
                      ],
                    ),
                  ),

我可以不使用 ListView.builder 做到这一点,但我需要使用 ListView.builder。垂直部分的高度应该等于里面的元素。

【问题讨论】:

【参考方案1】:

您必须定义任何滚动视图的高度。我更喜欢水平滚动视图

      SingleChildScrollView(
          child: Column(
            children: [
              Container(
                height: 150,
                child: ListView.builder(
                  physics: ClampingScrollPhysics(),
                  shrinkWrap: true,
                  scrollDirection: Axis.horizontal,
                  itemCount: 25,
                  itemBuilder: (BuildContext context, int index) 
                    ...
                    ...
                    ...
                  ,
                ),
              ),
              ListView.builder(
                itemCount: 10,
                shrinkWrap: true,
                scrollDirection: Axis.vertical,
                itemBuilder: (context, index) 
                  ...
                  ...
                  ...
                ,
              ),
            ],
          )
      )

【讨论】:

感谢您的回复,但我不断收到 hasSize 错误。【参考方案2】:

扩展使里面的物品变成全身。 只需将其删除,高度即可使项目高度等于卡片

    ListView.builder(
    itemCount: 10,
    shrinkWrap: true,
    scrollDirection: Axis.vertical,
    itemBuilder: (context, index) 
           return Card(
               child: Center(child: Text('Vertical List 
    Child')
       )
     );
   ,
 )

【讨论】:

经过我的尝试,实际上扩展卡在那里。我通常不会那样使用它,而且它不像你说的那样工作。【参考方案3】:

删除 SingleChildScrollView。 将 Expanded 作为父级添加到第二个 ListView。 从卡中删除扩展

【讨论】:

【参考方案4】:
Scaffold(
      body: SafeArea( //in case you dont have appbar
        child: CustomScrollView(
          physics: const BouncingScrollPhysics(),
          slivers: [
            
            const SliverToBoxAdaptar(child:Container(child:ListView(...)))// horizontalList
            const SliverList()// verticalSliverList
          ],
        ),
      ),
    );

试试这个

【讨论】:

我不能用这个,因为页面顶部有标签栏。 @oustW 看看这里***.com/questions/54512171/…

以上是关于在颤动的页面上同时使用水平和垂直 listview.builder的主要内容,如果未能解决你的问题,请参考以下文章

在垂直列表视图中颤动动态高度水平列表视图

在具有动态高度的同一页面上颤动两个 listview.builder

没有明确高度的水平 ListView 颤动

颤动水平列表视图/页面视图,选定元素动画到全宽

在颤动中滚动列表视图时剪辑填充

Flutter 如何使用 ListView 水平和 GridView 垂直滚动屏幕