如何基于视口高度约束颤振中的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 -

我试图根据视口高度限制ListView,以便在其中存在更多项目时滚动,但我还没有找到一种方法,可以在不提供大小框上的固定数字的情况下成功地实现这一点

布局如下所示:

- 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