如何根据视口高度约束Flutter中的ListView
How to constrain ListView in Flutter based on viewport height
我正在尝试根据视口高度限制 ListView,以便它在其中存在更多项目时滚动,但我还没有找到一种方法来成功地做到这一点,而无需在 SizedBox 上提供固定数字。
布局如下所示:
- SingleChildScrollView
- SizedBox (height equal to MediaQuery.of(context).size.height)
- Column
- Text
- TextField
- SizedBox (because I found no other way)
- ListView
这里要注意的是,我不希望列表沿着视图的其余部分滚动,而是让列表自己始终在视图中留下文本字段。
要在数据超出设备高度时滚动整个屏幕,那么您需要使用 SingleChildScrollView
小部件,它会在数据超出设备高度时滚动。我已经创建了它的示例,其中我使用 MediaQuery
来确定小部件的适当大小。请检查以下解决方案,如有疑问请告诉我。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _HomeScreen();
}
}
class _HomeScreen extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return _buildPage();
}
Widget _buildPage() {
return SafeArea(
top: true,
child: Scaffold(
body: SingleChildScrollView (
child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: MediaQuery.of(context).size.height),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
margin: const EdgeInsets.only(top: 20.0),
height: MediaQuery
.of(context)
.size
.height * 0.2,
child: Align(
alignment: Alignment.center,
child: Text("Ravindra Kushwaha", style: TextStyle(
fontSize: 20.0
),),
),
),
Padding(
padding: EdgeInsets.all(4.0),
child: TextField(
),
),
Expanded(
child: _buildList(),
),
],
),
)
),
),
);
}
Widget _buildList() {
return ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('First'),
trailing: Icon(Icons.arrow_forward_ios)
),
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('Seond'),
trailing: Icon(Icons.arrow_forward_ios)
),
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('Third'),
trailing: Icon(Icons.arrow_forward_ios)
),
],
);
}
}
输出如下。
我正在尝试根据视口高度限制 ListView,以便它在其中存在更多项目时滚动,但我还没有找到一种方法来成功地做到这一点,而无需在 SizedBox 上提供固定数字。
布局如下所示:
- SingleChildScrollView
- SizedBox (height equal to MediaQuery.of(context).size.height)
- Column
- Text
- TextField
- SizedBox (because I found no other way)
- ListView
这里要注意的是,我不希望列表沿着视图的其余部分滚动,而是让列表自己始终在视图中留下文本字段。
要在数据超出设备高度时滚动整个屏幕,那么您需要使用 SingleChildScrollView
小部件,它会在数据超出设备高度时滚动。我已经创建了它的示例,其中我使用 MediaQuery
来确定小部件的适当大小。请检查以下解决方案,如有疑问请告诉我。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _HomeScreen();
}
}
class _HomeScreen extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return _buildPage();
}
Widget _buildPage() {
return SafeArea(
top: true,
child: Scaffold(
body: SingleChildScrollView (
child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: MediaQuery.of(context).size.height),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
margin: const EdgeInsets.only(top: 20.0),
height: MediaQuery
.of(context)
.size
.height * 0.2,
child: Align(
alignment: Alignment.center,
child: Text("Ravindra Kushwaha", style: TextStyle(
fontSize: 20.0
),),
),
),
Padding(
padding: EdgeInsets.all(4.0),
child: TextField(
),
),
Expanded(
child: _buildList(),
),
],
),
)
),
),
);
}
Widget _buildList() {
return ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('First'),
trailing: Icon(Icons.arrow_forward_ios)
),
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('Seond'),
trailing: Icon(Icons.arrow_forward_ios)
),
ListTile(
leading: Icon(Icons.ac_unit),
title: Text('Third'),
trailing: Icon(Icons.arrow_forward_ios)
),
],
);
}
}
输出如下。