列内的 ListView 未正确展开
ListView inside column does not expanded correctly
我的 window 小部件:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
globals.strings["add_event_title"],
style: TextStyle(
fontSize: 18,
color: AppTheme.darkText,
fontWeight: FontWeight.w400,
),
),
),
body: Column(
children: [
Expanded(
child: Align(
alignment: FractionalOffset.topLeft,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AddEventWidget.withData(
categories: widget.categories,
geojson: widget.geojson,
address: widget.address,
),
),
),
),
Expanded(
child: Align(
alignment: FractionalOffset.bottomCenter,
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
color: AppTheme.buttonConfirm,
child: Text(
globals.strings["add_event_button_confirm"],
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
color: AppTheme.buttonCancel,
child: Text(
globals.strings["add_event_button_cancel"],
style: TextStyle(color: Colors.white),
),
),
),
)
],
),
),
)
],
),
);
}
AddEventWidget
实际上是 ListBox,如果没有空间显示所有控件,则可以滚动内容。为了进行测试,它目前充满了文本小部件:
Widget build(BuildContext context) {
return ListView(
children: [
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
],
);
}
因此,我确实获得了可滚动的 ListView,但我希望它适合剩余的 space(底部按钮不应滚动,它们需要始终显示在底部)。当前结果:
关于如何获得我需要的效果有什么想法吗?为什么我的 ListView 没有展开以适应剩余的 space 而底部按钮没有重叠?
只需从列的第二个子项中删除 Expanded,如下所示:
Align(
alignment: FractionalOffset.bottomCenter,
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
child: Text(
'globals.strings["add_event_button_confirm"]',
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
child: Text(
'globals.strings["add_event_button_cancel"]',
style: TextStyle(color: Colors.white),
),
),
),
)
],
),
),
这是由 flutter 正确呈现的,问题出在你这边。
您在 Column
中使用 two expanded widgets
,因为 screen space
可用分为 two equal parts
。
这导致 first expanded widget
的大小只有可用列的一半,因此 ListView
达到屏幕中间的最大支出。
两个解决这个问题,让 ListView
占用所有可用的 space 你可以 remove expanded
小部件 from
第二个 child 即 Row
.然后在 ListView property
shrinkWrap 中将其设置为 true
.
这里是代码片段
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
title: Text(
"add_event_title",
style: TextStyle(
fontSize: 18,
color: Colors.blue,
fontWeight: FontWeight.w400,
),
),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Align(
alignment: FractionalOffset.topLeft,
child: Padding(
padding: const EdgeInsets.all(8.0),
child:ListView.builder(
itemBuilder: (BuildContext context,int index){
return Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
},
itemCount: 100,
shrinkWrap: true,
),
),
),
),
Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
color: Colors.green,
child: Text(
"confirm",
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
color: Colors.black45,
child: Text("cancel",
style: TextStyle(color: Colors.white),
),
),
),
)
],
)
],
),
);
}
我的 window 小部件:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
globals.strings["add_event_title"],
style: TextStyle(
fontSize: 18,
color: AppTheme.darkText,
fontWeight: FontWeight.w400,
),
),
),
body: Column(
children: [
Expanded(
child: Align(
alignment: FractionalOffset.topLeft,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AddEventWidget.withData(
categories: widget.categories,
geojson: widget.geojson,
address: widget.address,
),
),
),
),
Expanded(
child: Align(
alignment: FractionalOffset.bottomCenter,
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
color: AppTheme.buttonConfirm,
child: Text(
globals.strings["add_event_button_confirm"],
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
color: AppTheme.buttonCancel,
child: Text(
globals.strings["add_event_button_cancel"],
style: TextStyle(color: Colors.white),
),
),
),
)
],
),
),
)
],
),
);
}
AddEventWidget
实际上是 ListBox,如果没有空间显示所有控件,则可以滚动内容。为了进行测试,它目前充满了文本小部件:
Widget build(BuildContext context) {
return ListView(
children: [
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
],
);
}
因此,我确实获得了可滚动的 ListView,但我希望它适合剩余的 space(底部按钮不应滚动,它们需要始终显示在底部)。当前结果:
关于如何获得我需要的效果有什么想法吗?为什么我的 ListView 没有展开以适应剩余的 space 而底部按钮没有重叠?
只需从列的第二个子项中删除 Expanded,如下所示:
Align(
alignment: FractionalOffset.bottomCenter,
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
child: Text(
'globals.strings["add_event_button_confirm"]',
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
child: Text(
'globals.strings["add_event_button_cancel"]',
style: TextStyle(color: Colors.white),
),
),
),
)
],
),
),
这是由 flutter 正确呈现的,问题出在你这边。
您在 Column
中使用 two expanded widgets
,因为 screen space
可用分为 two equal parts
。
这导致 first expanded widget
的大小只有可用列的一半,因此 ListView
达到屏幕中间的最大支出。
两个解决这个问题,让 ListView
占用所有可用的 space 你可以 remove expanded
小部件 from
第二个 child 即 Row
.然后在 ListView property
shrinkWrap 中将其设置为 true
.
这里是代码片段
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
title: Text(
"add_event_title",
style: TextStyle(
fontSize: 18,
color: Colors.blue,
fontWeight: FontWeight.w400,
),
),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Align(
alignment: FractionalOffset.topLeft,
child: Padding(
padding: const EdgeInsets.all(8.0),
child:ListView.builder(
itemBuilder: (BuildContext context,int index){
return Text("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
},
itemCount: 100,
shrinkWrap: true,
),
),
),
),
Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => {},
padding: EdgeInsets.all(12.0),
color: Colors.green,
child: Text(
"confirm",
style: TextStyle(color: Colors.white),
),
),
),
),
Spacer(),
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: MediaQuery.of(context).size.width / 2 - 16,
child: RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24.0)),
onPressed: () => Navigator.of(context).pop(),
padding: EdgeInsets.all(12.0),
color: Colors.black45,
child: Text("cancel",
style: TextStyle(color: Colors.white),
),
),
),
)
],
)
],
),
);
}