如何在 Flutter 的同一屏幕上沿 ListView 显示小部件?
How to show a widget along a ListView on the same screen in Flutter?
我正在尝试构建一个非常简单的 ToDo 应用程序。它由屏幕顶部的 TextField
和 Button
(一种表单)组成,允许用户将项目添加到 TextField
正下方的 ListView
.
我能够显示 TextField
和 Button
,我也能够显示 ListView
,但是当我尝试同时显示两者时时间,屏幕是空的。
我错过了什么吗?我尝试将 ListView 显示到 Column 小部件中,但它看起来不起作用。
这是我的没有格式的短代码:
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context){
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(
title: Text("My app")
),
body: Column(
children: <Widget>[
ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
)
])),
);
}
}
谢谢!
ListView
的垂直视口被赋予无限高度。用 Expanded
widget
包装你的 ListView
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(title: Text("My app")),
body: Column(children: <Widget>[
RaisedButton(onPressed: () {}),
Expanded(
child: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
),
)
])),
);
}
}
您应该在 ListView 周围使用 Expanded
小部件。所做的是扩展其子项(在本例中为 ListView)以适应父项的最大可用 space,不包括其他小部件占用的 space。
然后,当您想在底部添加输入时,只需将普通小部件放在 Column
内,但放在 ListView
外,这样列表就会滚动,并且TextField 将始终位于页面底部。
这是准备好底部输入的代码,但我建议您尝试仔细了解 Columns、Rows 和 Expanded 小部件的情况。
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context){
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(
title: Text("My app")
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Expanded(
child: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
),
),
Row(
children: <Widget>[
Expanded(
child: TextField(
decoration: InputDecoration(
hintText: "What to do?"
),
),
),
IconButton(
icon: Icon(Icons.send),
onPressed: (){
//do something
},
)
],
)
],
),
),
);
}
}
另一个更好的解决方案是将其变形为 Flexible:
Flexible:
child:
Listview.builder {
// following two lines needed to make it work
shrinkWrap: true
physics: ScrollPhysics(),
// the rest of your code
}
记住避免边界错误和抖动警告以及正确显示列表所需的两行。
我正在尝试构建一个非常简单的 ToDo 应用程序。它由屏幕顶部的 TextField
和 Button
(一种表单)组成,允许用户将项目添加到 TextField
正下方的 ListView
.
我能够显示 TextField
和 Button
,我也能够显示 ListView
,但是当我尝试同时显示两者时时间,屏幕是空的。
我错过了什么吗?我尝试将 ListView 显示到 Column 小部件中,但它看起来不起作用。
这是我的没有格式的短代码:
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context){
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(
title: Text("My app")
),
body: Column(
children: <Widget>[
ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
)
])),
);
}
}
谢谢!
ListView
的垂直视口被赋予无限高度。用 Expanded
widget
ListView
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(title: Text("My app")),
body: Column(children: <Widget>[
RaisedButton(onPressed: () {}),
Expanded(
child: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
),
)
])),
);
}
}
您应该在 ListView 周围使用 Expanded
小部件。所做的是扩展其子项(在本例中为 ListView)以适应父项的最大可用 space,不包括其他小部件占用的 space。
然后,当您想在底部添加输入时,只需将普通小部件放在 Column
内,但放在 ListView
外,这样列表就会滚动,并且TextField 将始终位于页面底部。
这是准备好底部输入的代码,但我建议您尝试仔细了解 Columns、Rows 和 Expanded 小部件的情况。
import 'package:flutter/material.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context){
return MaterialApp(
title: "Mon app",
home: Scaffold(
appBar: AppBar(
title: Text("My app")
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Expanded(
child: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
),
),
Row(
children: <Widget>[
Expanded(
child: TextField(
decoration: InputDecoration(
hintText: "What to do?"
),
),
),
IconButton(
icon: Icon(Icons.send),
onPressed: (){
//do something
},
)
],
)
],
),
),
);
}
}
另一个更好的解决方案是将其变形为 Flexible:
Flexible:
child:
Listview.builder {
// following two lines needed to make it work
shrinkWrap: true
physics: ScrollPhysics(),
// the rest of your code
}
记住避免边界错误和抖动警告以及正确显示列表所需的两行。