Flutter 颤振中垂直滚动视图内的水平列表视图

Flutter 颤振中垂直滚动视图内的水平列表视图,flutter,listview,flutter-layout,horizontal-scrolling,vertical-scrolling,Flutter,Listview,Flutter Layout,Horizontal Scrolling,Vertical Scrolling,我现在正试图实现一个非常常见的行为,即在另一个小部件中有一个同时可滚动的水平列表。想象一下IMDb应用程序的主屏幕: 所以我想有一个垂直滚动的小部件,上面只有很少的项目。在它的顶部,应该有一个水平的列表视图,后面是一些名为动机卡片的项目。列表和卡片之间也有一些标题 我在我的小部件上得到了类似的东西: @override Widget build(BuildContext context) => BlocBuilder<HomeEvent, HomeState>(

我现在正试图实现一个非常常见的行为,即在另一个小部件中有一个同时可滚动的水平列表。想象一下IMDb应用程序的主屏幕:

所以我想有一个垂直滚动的小部件,上面只有很少的项目。在它的顶部,应该有一个水平的
列表视图
,后面是一些名为
动机卡片
的项目。列表和卡片之间也有一些标题

我在我的
小部件上得到了类似的东西:

@override
  Widget build(BuildContext context) => BlocBuilder<HomeEvent, HomeState>(
        bloc: _homeBloc,
        builder: (BuildContext context, HomeState state) => Scaffold(
              appBar: AppBar(),
              body: Column(
                children: <Widget>[
                  Text(
                    Strings.dailyTasks,
                  ),
                  ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: tasks.length,
                    itemBuilder: (BuildContext context, int index) =>
                        taskCard(
                          taskNumber: index + 1,
                          taskTotal: tasks.length,
                          task: tasks[index],
                        ),
                  ),
                  Text(
                    Strings.motivations,
                  ),
                  motivationCard(
                    motivation: Motivation(
                        title: 'Motivation 1',
                        description:
                        'this is a description of the motivation'),
                  ),
                  motivationCard(
                    motivation: Motivation(
                        title: 'Motivation 2',
                        description:
                        'this is a description of the motivation'),
                  ),
                  motivationCard(
                    motivation: Motivation(
                        title: 'Motivation 3',
                        description:
                        'this is a description of the motivation'),
                  ),
                ],
              ),
            ),
      );
我试过:

  • 使用扩展的
小部件包装ListView

  • 使用
    SingleChildScrollView>ConstrainedBox>IntrinsicHeight

  • CustomScrollView
    作为父级,使用
    SliverList
    SliverChildListDelegate中的列表

  • 这些都不起作用,我继续得到同样的错误。这是一件非常普通的事情,不应该太难,不知何故,我就是无法让它发挥作用:(

    任何帮助都将不胜感激,谢谢

    编辑:


    我本以为可以帮我,但它没有帮到我。

    好吧,你的代码可以很好地将你的-ListView.builder包装成扩展的小部件& 设置
    mainAxisSize:mainAxisSize.min,
    列的
    小部件

    你拥有的东西的E.x代码

     body: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text(
                'Headline',
                style: TextStyle(fontSize: 18),
              ),
              Expanded(
                child: ListView.builder(
                  shrinkWrap: true,
                  scrollDirection: Axis.horizontal,
                  itemCount: 15,
                  itemBuilder: (BuildContext context, int index) => Card(
                        child: Center(child: Text('Dummy Card Text')),
                      ),
                ),
              ),
              Text(
                'Demo Headline 2',
                style: TextStyle(fontSize: 18),
              ),
              Expanded(
                child: ListView.builder(
                  shrinkWrap: true,
                  itemBuilder: (ctx,int){
                    return Card(
                      child: ListTile(
                          title: Text('Motivation $int'),
                          subtitle: Text('this is a description of the motivation')),
                    );
                  },
                ),
              ),
            ],
          ),
    

    屏幕截图:


    class\u HomePageState扩展状态{
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    正文:ListView.builder(
    物品计数:7,
    itemBuilder:(u,i){
    如果(i<2)
    返回构建框(颜色:Colors.blue);
    else如果(i==3)
    返回_horizontalListView();
    其他的
    返回构建框(颜色:Colors.blue);
    },
    ),
    );
    }
    Widget_horizontalListView(){
    返回大小框(
    身高:120,
    子项:ListView.builder(
    滚动方向:轴水平,
    itemBuilder:(,_)=>buildBox(颜色:Colors.orange),
    ),
    );
    }
    Widget_buildBox({Color Color})=>容器(边距:EdgeInsets.all(12),高度:100,宽度:200,颜色:Color);
    }
    
    以这种方式解决水平列表视图中的垂直列表视图

    ListView.builder(
      itemBuilder: (context, index) =>
          Column(children: [
            _userProfileLayout(reviewPage.items[index]),
            Container(
              height: 100,
              child:
              ListView.builder( scrollDirection: Axis.horizontal,
                  itemBuilder: (context, index) => Text("dddd")),
            ),
            FadeInImage.assetNetwork(
                placeholder: "images/default_review_img.png",
                image:
                "${reviewPage.items[index].multimedias[0]
                    .url}"),
            _placeLayout(reviewPage.items[index])
          ]),
    )
     
    
    您也可以通过这种方式切换到
    SingleChildScrollview中的

    ListView.builder(
      itemCount: 3,
      scrollDirection: Axis.vertical,
      itemBuilder: (context, position) {
        if (position == 0) {
          return Container(
            child: Text("First rwo"),
          );
        } else if (position == 1) {
          return Container(
            child: Text("second  rwo"),
          );
        } else if (position == 2) {
          return SingleChildScrollView(
            scrollDirection: Axis.horizontal,
            child: Row(
              children: [Text("List"), Text("List"), Text("List"), Text("List")],
            ),
          );
        }
      },
    )
    

    第二个积分是我们必须在另一个
    SingleScrollView
    内部使用
    SingleScrollView
    ,使用
    ListView
    需要固定高度

    SingleChildScrollView(
       child: Column(
          children: <Widget>[
            SingleChildScrollView(
              scrollDirection: Axis.horizontal,
              child: Row(
              children: [Text('H1'), Text('H2'), Text('H3')])),
            Text('V1'),
            Text('V2'),
            Text('V3')]))
    
    SingleChildScrollView(
    子:列(
    儿童:[
    SingleChildScrollView(
    滚动方向:轴水平,
    孩子:排(
    子项:[Text('H1')、Text('H2')、Text('H3')]),
    文本('V1'),
    文本('V2'),
    文本('V3')]))
    
    垂直列表视图在哪里?没有垂直列表视图。我希望整个屏幕都可以滚动。想象一个列,但可以滚动。然后在该列中,我希望有一个水平滚动的列表视图。该列中的其他子项将是不同的项,即标题、卡片和其他。试试这个:谢谢您的支持快速回复!我也做到了,但这并不完全是我所需要的。我希望激励项目不在列表中,这样整个屏幕就会向下滚动,这样如果滚动足够多,水平列表就会从屏幕上消失。有没有关于如何实现这一点的想法?太棒了,这正是我想要的。这确实并不复杂,thank you!!此评论是代表以下内容添加的:如果水平滚动项目的高度可能不同怎么办?我试图不设置用大小框固定的列表大小,为什么当您有一个滚动作为父项时,
    shrinkWrap:true
    不起作用?是否可以在没有静态高度的情况下使用水平listview?@Balajiramados请看我的答案
    ListView.builder(
      itemBuilder: (context, index) =>
          Column(children: [
            _userProfileLayout(reviewPage.items[index]),
            Container(
              height: 100,
              child:
              ListView.builder( scrollDirection: Axis.horizontal,
                  itemBuilder: (context, index) => Text("dddd")),
            ),
            FadeInImage.assetNetwork(
                placeholder: "images/default_review_img.png",
                image:
                "${reviewPage.items[index].multimedias[0]
                    .url}"),
            _placeLayout(reviewPage.items[index])
          ]),
    )
     
    
    ListView.builder(
      itemCount: 3,
      scrollDirection: Axis.vertical,
      itemBuilder: (context, position) {
        if (position == 0) {
          return Container(
            child: Text("First rwo"),
          );
        } else if (position == 1) {
          return Container(
            child: Text("second  rwo"),
          );
        } else if (position == 2) {
          return SingleChildScrollView(
            scrollDirection: Axis.horizontal,
            child: Row(
              children: [Text("List"), Text("List"), Text("List"), Text("List")],
            ),
          );
        }
      },
    )
    
    SingleChildScrollView(
       child: Column(
          children: <Widget>[
            SingleChildScrollView(
              scrollDirection: Axis.horizontal,
              child: Row(
              children: [Text('H1'), Text('H2'), Text('H3')])),
            Text('V1'),
            Text('V2'),
            Text('V3')]))