如何基于视口高度约束颤振中的ListView
我试图根据视口高度限制ListView,以便在其中存在更多项目时滚动,但我还没有找到一种方法,可以在不提供大小框上的固定数字的情况下成功地实现这一点 布局如下所示:如何基于视口高度约束颤振中的ListView,listview,flutter,scroll,constraints,flutter-layout,Listview,Flutter,Scroll,Constraints,Flutter Layout,我试图根据视口高度限制ListView,以便在其中存在更多项目时滚动,但我还没有找到一种方法,可以在不提供大小框上的固定数字的情况下成功地实现这一点 布局如下所示: - SingleChildScrollView - SizedBox (height equal to MediaQuery.of(context).size.height) - Column - Text -
- SingleChildScrollView
- SizedBox (height equal to MediaQuery.of(context).size.height)
- Column
- Text
- TextField
- SizedBox (because I found no other way)
- ListView
这里需要注意的是,我不希望列表沿着视图的其余部分滚动,而是让textfield始终处于视图中
对于从设备高度超过数据时的整个屏幕滚动,则需要使用
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)
),
],
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
类主屏幕扩展StatefulWidget{
@凌驾
状态createState(){
//TODO:实现createState
返回主屏幕();
}
}
类_主屏幕扩展状态{
@凌驾
小部件构建(构建上下文){
返回_buildPage();
}
小部件_buildPage(){
返回安全区(
托普:没错,
孩子:脚手架(
正文:SingleChildScrollView(
子:约束框(
约束:BoxConstraints(maxHeight:MediaQuery.of(context).size.height),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
容器(
边距:仅限常量边集(顶部:20.0),
高度:MediaQuery
.of(上下文)
.尺寸
.高度*0.2,
子对象:对齐(
对齐:对齐.center,
子项:文本(“Ravindra Kushwaha”,样式:TextStyle(
字体大小:20.0
),),
),
),
填充物(
填充:所有边缘设置(4.0),
孩子:TextField(
),
),
扩大(
子项:_buildList(),
),
],
),
)
),
),
);
}
小部件_buildList(){
返回列表视图(
儿童:[
列表砖(
前导:图标(图标。交流单元),
标题:文本(‘第一’),
尾随:图标(图标。箭头\前进\ ios)
),
列表砖(
前导:图标(图标。交流单元),
标题:文本(“Seond”),
尾随:图标(图标。箭头\前进\ ios)
),
列表砖(
前导:图标(图标。交流单元),
标题:文本(‘第三’),
尾随:图标(图标。箭头\前进\ ios)
),
],
);
}
}
输出将如下所示
对于从设备高度超过数据时的整个屏幕滚动,则需要使用
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)
),
],
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
类主屏幕扩展StatefulWidget{
@凌驾
状态createState(){
//TODO:实现createState
返回主屏幕();
}
}
类_主屏幕扩展状态{
@凌驾
小部件构建(构建上下文){
返回_buildPage();
}
小部件_buildPage(){
返回安全区(
托普:没错,
孩子:脚手架(
正文:SingleChildScrollView(
子:约束框(
约束:BoxConstraints(maxHeight:MediaQuery.of(context).size.height),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
容器(
边距:仅限常量边集(顶部:20.0),
高度:MediaQuery
.of(上下文)
.尺寸
.高度*0.2,
子对象:对齐(
对齐:对齐.center,
子项:文本(“Ravindra Kushwaha”,样式:TextStyle(
字体大小:20.0
),),
),
),
填充物(
填充:所有边缘设置(4.0),
孩子:TextField(
),
),
扩大(
子项:_buildList(),
),
],
),
)
),
),
);
}
小部件_buildList(){
返回列表视图(
儿童:[
列表砖(
前导:图标(图标。交流单元),
标题:文本(‘第一’),
尾随:图标(图标。箭头\前进\ ios)
),
列表砖(
前导:图标(图标。交流单元),
标题:文本(“Seond”),
尾随:图标(图标。箭头\前进\ ios)
),
列表砖(
前导:图标(图标。交流单元),
标题:文本(‘第三’),
尾随:图标(图标。箭头\前进\ ios)
),
],
);
}
}
输出将如下所示
您现在遇到了什么问题为什么不
列[Text,TextField,Expanded>ListView]
?如果没有滚动容器,当键盘打开时,我会出现溢出错误。请检查下面的解决方案I,当键盘出现t时,我有texfield