Flutter 颤振中垂直滚动视图内的水平列表视图
我现在正试图实现一个非常常见的行为,即在另一个小部件中有一个同时可滚动的水平列表。想象一下IMDb应用程序的主屏幕: 所以我想有一个垂直滚动的小部件,上面只有很少的项目。在它的顶部,应该有一个水平的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>(
列表视图
,后面是一些名为动机卡片
的项目。列表和卡片之间也有一些标题
我在我的小部件上得到了类似的东西:
@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')]))