我不确定是否遗漏了一些东西。我正在玩Flutter,我想用一些文本小部件,按钮和其他小部件构建一个(简单的)视图(请参见下图)。这些小部件后面应有一个项目列表。整个视图(当然,应用程序栏除外)应该是可滚动的-不仅是项目。
这就是为什么我将所有内容都放在ListView中的原因。但是我无法执行以下操作(而items
是具有字符串值的映射):
...
home: Scaffold(
appBar: AppBar(
title: Text('App bar'),
),
body: new ListView(
children: <Widget>[
new Text('Some Text'),
new FlatButton(...),
new Image.asset(...),
items.map((item)=>new Padding(
child: new Text(item.title),
)).toList()
],
),
),
...
获得所需视图的正确方法是什么?
谢谢!
答案 0 :(得分:1)
您可以在body
中使用以下代码。
body: SingleChildScrollView( //add to Scroll whole screen
child: Column(
children: <Widget>[
new Text('Some Text'), //Element-1
new FlatButton(...), //Element-2
new Image.asset(...), //Element-3
items.map((item)=>new Padding(child: new Text(item.title),)).toList(), //Element-4
ListView.separated( //Element-5
shrinkWrap: true, //this property is must when you put List/Grid View inside SingleChildScrollView
physics: NeverScrollableScrollPhysics(), //this property is must when you put List/Grid View inside SingleChildScrollView
itemCount: listItems.length,
itemBuilder: (context, i) {
return ListTile(
title: Text(listItems[i].Title),
subtitle: Text(listItems[i].Description),
);
},
separatorBuilder: (context, i) {
return Divider();
},
),
],
),
),
答案 1 :(得分:1)
您可以使用ListView.builder
,因为效率更高,因为只有在滚动到屏幕上时才创建项目。在第一个位置,您可以放置不在列表中的小部件,如下所示:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('App bar')),
body: ListView.builder(
itemCount: items.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
return Column(
children: <Widget>[
Text('Some Text'),
FlatButton(child: Text('A flat button'), onPressed: () {}),
Image.asset("An image"),
],
);
}
return Text('Item ${items[index].title}');
},
),
);
}
答案 2 :(得分:0)
ListView中的子项是itens的列表,因此,如果要显示按钮或文本,则小部件树为:
Scaffold
appBar: AppBar
body: Container
child: ListView
ListItem
ListItem
ListItem
然后,根据您的情况,您可以使用“列”来显示“固定的小部件”(文本,按钮)和可滚动的列表视图:
Scaffold
appBar: AppBar
body: Column
[
Text,
Buttom,
ListView
ListItem
ListItem
ListItem
]
答案 3 :(得分:0)
您可以这样使用
ListView(
shrinkWrap: true,
children: <Widget>[
Text('hi'),//first widget
Text('hi2'),//second widget
Flex(
direction: Axis.horizontal,children: <Widget>[
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: 3,
itemBuilder: (BuildContext context, int index){
return ...
或 只需调整计数和索引即可。
ListView.builder(
itemCount: get.length + 2, // add room for the two extra
itemBuilder: (BuildContext context, int index) {
if(index == 0){
return Text('Custom any widget');
}
if(index == 1){
return Text('Custom any widget');
}
index -= 2; // decrement index so that it's now in the range [0..length]
return Bubble(
style: styleSomebody,
child: Container(
...
));
}),