Flutter 颤振:如何修复底部溢流

Flutter 颤振:如何修复底部溢流,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我有一个flatter小部件,它的列布局有两个容器,其中一个容器有一个ListView.builder。当页面呈现时,我得到一个 底部溢流169px 我也不知道如何修复它 我在谷歌上搜索了各种解决方案,并尝试了各种方法,比如将小部件中的一个或多个容器包装到一个扩展的小部件中,但这也不起作用。如果我仅将包含FutureBuilder的容器包装在展开的中,则列表视图根本不会呈现,我会看到如下错误: I/flutter ( 3516): Another exception was thrown: Re

我有一个flatter小部件,它的列布局有两个容器,其中一个容器有一个
ListView.builder
。当页面呈现时,我得到一个

底部溢流169px

我也不知道如何修复它

我在谷歌上搜索了各种解决方案,并尝试了各种方法,比如将小部件中的一个或多个
容器
包装到一个
扩展的
小部件中,但这也不起作用。如果我仅将包含
FutureBuilder
容器
包装在
展开的
中,则
列表视图
根本不会呈现,我会看到如下错误:

I/flutter ( 3516): Another exception was thrown: RenderFlex children have non-zero flex but incoming height constraints are unbounded.
I/flutter ( 3516): Another exception was thrown: RenderBox was not laid out: RenderFlex#0caf9 relayoutBoundary=up2 NEEDS-PAINT
I/flutter ( 3516): Another exception was thrown: RenderBox was not laid out: RenderFlex#963f4 relayoutBoundary=up1 NEEDS-PAINT
I/flutter ( 3516): Another exception was thrown: NoSuchMethodError: The method '<=' was called on null.
I/flatter(3516):引发了另一个异常:RenderFlex子项具有非零flex,但传入的高度约束是无界的。
I/flatter(3516):引发了另一个异常:RenderBox未布局:RenderFlex#0caf9 relayoutBoundary=up2 NEEDS-PAINT
I/flatter(3516):引发了另一个异常:RenderBox未布局:RenderFlex#963f4 relayoutBoundary=up1 NEEDS-PAINT

I/flatter(3516):引发了另一个异常:NoSuchMethodError:method'只需将您的
FutureBuilder
包装到一个
扩展的
小部件中,并删除
容器,因为您根本不需要它

 Expanded(
        child: FutureBuilder<UserPantry>(
           future: UserPantryDao.getUserPantry(widget.userId),
   ...
扩展(
孩子:未来建设者(
future:UserPantryDao.getUserPantry(widget.userId),
...

发生这种情况的原因是您为
列表视图
提供了无限的约束。另一个选项是向
列表视图
父级添加一些
高度
约束,例如将
容器
中的
高度设置为某个值。

尝试将
容器
移到外部,并将列表包装起来以扩大的方式。 正如@Miguel Ruivo所回答的,ListView必须有一个有界约束

Widget build(BuildContext context) {
    return Column(children: <Widget>[
      Container(
          height: 40,
          color: Colors.grey.withOpacity(0.5),
          child: Padding(
              padding: const EdgeInsets.fromLTRB(10.0, 2.0, 10.0, 2.0),
              child: TextField(
                  autofocus: false,
                  controller: searchFilterController,
                  keyboardType: TextInputType.text,
                  maxLines: 1,
                  decoration: InputDecoration(
                      border: InputBorder.none,
                      filled: true,
                      fillColor: Colors.white.withOpacity(1),
                      hintText: 'Search',
                      suffixIcon: Icon(
                        Icons.search,
                        color: Colors.grey,
                      )),
                  onChanged: (value) {
                    filter = value;
                  }))),
      Expanded(
          child: FutureBuilder<UserPantry>(
        future: UserPantryDao.getUserPantry(widget.userId),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            widget.ingredientList.clear();
            if (filter == null || filter.trim() == "") {
              widget.ingredientList.addAll(snapshot.data.ingredients);
            } else {
              for (UserIngredient ingredient in snapshot.data.ingredients) {
                if (ingredient.ingredient.name
                    .toLowerCase()
                    .contains(filter.toLowerCase())) {
                  widget.ingredientList.add(ingredient);
                }
              }
            }

            return ListView.builder(
                shrinkWrap: true,
                itemCount: widget.ingredientList.length,
                itemBuilder: (BuildContext context, int index) {
                  return ListTile(
                      title: Text(
                    widget.ingredientList[index].ingredient.name,
                    style: TextStyle(fontSize: 20.0),
                  ));
                });
          } else if (snapshot.hasError) {
            print(snapshot.error);
            return Text(
                "An error occurred while loading your pantry. Please try again.");
          }
          //By default just show an empty container.
          return Container();
        },
      ))
    ]);
  }
小部件构建(构建上下文){
返回列(子项:[
容器(
身高:40,
颜色:颜色。灰色。不透明度(0.5),
孩子:填充(
填充:LTRB(10.0,2.0,10.0,2.0)中的常数边集,
孩子:TextField(
自动对焦:错误,
控制器:searchFilterController,
键盘类型:TextInputType.text,
maxLines:1,
装饰:输入装饰(
边框:InputBorder.none,
是的,
填充颜色:颜色。白色。不透明度(1),
hintText:'搜索',
图标:图标(
Icons.search,
颜色:颜色。灰色,
)),
一旦更改:(值){
过滤器=值;
}))),
扩大(
孩子:未来建设者(
future:UserPantryDao.getUserPantry(widget.userId),
生成器:(上下文,快照){
if(snapshot.hasData){
widget.ingredientList.clear();
if(filter==null | | filter.trim()==“”){
widget.ingredientList.addAll(snapshot.data.components);
}否则{
for(snapshot.data.components中的UserComponent成分){
if(component.component.name)
.toLowerCase()
.contains(filter.toLowerCase()){
widget.IngreditList.add(成分);
}
}
}
返回ListView.builder(
收缩膜:对,
itemCount:widget.IngreditList.length,
itemBuilder:(构建上下文,int索引){
返回列表块(
标题:正文(
widget.IngreditList[index].component.name,
样式:TextStyle(fontSize:20.0),
));
});
}else if(snapshot.hasrerror){
打印(快照错误);
返回文本(
“加载您的餐具室时出错。请重试。”);
}
//默认情况下,只显示一个空容器。
返回容器();
},
))
]);
}

包装
ListView.separated(separatorBuilder:(context,index)=>Divider(),…)
中的
展开的
将解决您的问题


例如:
Expanded(child:ListView.separated(separatorBuilder:(context,index)=>Divider(),itemCount:1,itemBuilder:(context,index){return Container(height:200.0,child:…);})
只需用
Expanded
包装
列表即可。
试试这个:

Column(
            children: [
              Container(
                child: Text("data"),
                color: Colors.redAccent,
              ),
              Expanded(child: ListView.builder(itemBuilder: (context, i) {
                return Text("data");
              })),
            ],
          ),

这是我已经尝试过的事情之一,但是当我这样做时,整个页面都是空白的,我在控制台中看到了这些错误:I/flatter(5471):引发了另一个异常:RenderBox没有布局:RenderFlex#350b4 relayoutBoundary=up2 NEEDS-PAINT I/flatter(5471):引发了另一个异常:未布置RenderBox:RenderFlex#3fe57 relayoutBoundary=up1 NEEDS-PAINT I/颤振(5471):引发了另一个异常:NoSuchMethodError:方法“我没有你的整棵树。正如你现在所做的,它应该可以工作。不管怎样,只要为
容器设置一些高度,你就可以了。在容器上设置一个高度可以解决问题,但我如何知道要使用什么高度?它不会因设备而异吗ice?是的,但您可以使用%,通过执行
MediaQuery.of(context).size.height*0.5
,将
列表视图设置为使用屏幕高度的50%。但是,使用
展开的
时,您不应该需要这个,它也应该可以工作,因为您将展开以垂直填充视口。
Column(
            children: [
              Container(
                child: Text("data"),
                color: Colors.redAccent,
              ),
              Expanded(child: ListView.builder(itemBuilder: (context, i) {
                return Text("data");
              })),
            ],
          ),