Flutter 断言失败:第551行第12位:';child.hasSize';:事实并非如此
我是新来的,我在一个电子商务网站上工作,我想在我的欢迎页面中添加一个网格,显示最近的产品,我试图使用GridVeiw.builder,但我遇到了一个错误 失败的断言:第551行位置12:“child.hasSize”:不正确 我不明白为什么我会看到这个错误 我的欢迎屏幕Flutter 断言失败:第551行第12位:';child.hasSize';:事实并非如此,flutter,dart,flutter-layout,flutter-widget,Flutter,Dart,Flutter Layout,Flutter Widget,我是新来的,我在一个电子商务网站上工作,我想在我的欢迎页面中添加一个网格,显示最近的产品,我试图使用GridVeiw.builder,但我遇到了一个错误 失败的断言:第551行位置12:“child.hasSize”:不正确 我不明白为什么我会看到这个错误 我的欢迎屏幕 import 'package:ecommerce_practice/components/carousel.dart'; import 'package:ecommerce_practice/components/horizo
import 'package:ecommerce_practice/components/carousel.dart';
import 'package:ecommerce_practice/components/horizontal_list.dart';
import 'package:ecommerce_practice/components/products.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class WelcomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('E-commerce'),
backgroundColor: Colors.red,
actions: [
IconButton(
icon: Icon(
Icons.search,
),
color: Colors.white,
onPressed: () {},
),
IconButton(
icon: Icon(Icons.shopping_cart),
color: Colors.white,
onPressed: () {},
)
],
),
drawer: Drawer(
child: ListView(
children: [
UserAccountsDrawerHeader(
accountName: Text("Aleem"),
accountEmail: Text('aleem.alam@outlook.com'),
currentAccountPicture: GestureDetector(
child: CircleAvatar(
backgroundColor: Colors.grey,
child: Icon(
Icons.person,
color: Colors.white,
),
),
),
decoration: BoxDecoration(color: Colors.red),
),
DrawerMenuButton(
title: 'Home',
icon: Icon(
Icons.home,
color: Colors.red,
),
),
DrawerMenuButton(
title: 'My Account',
icon: Icon(
Icons.person,
color: Colors.red,
),
),
DrawerMenuButton(
title: 'My Order',
icon: Icon(
Icons.shopping_basket,
color: Colors.red,
),
),
DrawerMenuButton(
title: 'Category',
icon: Icon(
Icons.category,
color: Colors.red,
),
),
DrawerMenuButton(
title: 'Favourites',
icon: Icon(
Icons.favorite,
color: Colors.red,
),
),
Divider(),
DrawerMenuButton(
title: 'Settings',
icon: Icon(
Icons.settings,
color: Colors.blue,
),
),
DrawerMenuButton(
title: 'About Us',
icon: Icon(
Icons.help,
color: Colors.blue,
),
),
],
),
),
body: ListView(
children: [
ImageCarousel(),
Padding(
padding: EdgeInsets.all(10.0),
child: Text('Category'),
),
HorizontalList(),
Padding(
padding: EdgeInsets.all(10.0),
child: Text('Recent Product'),
),
Products(),
],
),
);
}
}
class DrawerMenuButton extends StatelessWidget {
DrawerMenuButton({this.title, this.icon});
final String title;
final Icon icon;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {},
child: ListTile(
title: Text(title),
leading: icon,
),
);
}
}
飞镖
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class Products extends StatefulWidget {
@override
_ProductsState createState() => _ProductsState();
}
class _ProductsState extends State<Products> {
List<dynamic> products = [
{
'name': 'Shirt',
'image': 'images/category.jpg',
'old_price': 200,
'price': 140,
},
{
'name': 'Shirt',
'image': 'images/category.jpg',
'old_price': 200,
'price': 140,
}
];
@override
Widget build(BuildContext context) {
return GridView.builder(
itemCount: products.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
itemBuilder: (context, index) {
return Product(
name: products[index]['name'],
image: products[index]['image'],
oldPrice: products[index]['old_price'],
finalPrice: products[index]['price'],
);
},
);
}
}
class Product extends StatelessWidget {
Product({this.name, this.image, this.oldPrice, this.finalPrice});
final String name, image;
final int oldPrice, finalPrice;
@override
Widget build(BuildContext context) {
return Card(
child: Hero(
tag: name,
child: Material(
child: InkWell(
onTap: () {},
child: GridTile(
footer: Container(
color: Colors.white,
child: ListTile(
leading: Text(
name,
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
),
),
child: Image.asset(
image,
fit: BoxFit.cover,
),
),
),
),
),
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
类产品扩展了StatefulWidget{
@凌驾
_ProductsState createState()=>\u ProductsState();
}
类_ProductsState扩展状态{
列出产品=[
{
“姓名”:“衬衫”,
'image':'images/category.jpg',
“旧价格”:200,
"价格":140,,
},
{
“姓名”:“衬衫”,
'image':'images/category.jpg',
“旧价格”:200,
"价格":140,,
}
];
@凌驾
小部件构建(构建上下文){
返回GridView.builder(
itemCount:products.length,
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
),
itemBuilder:(上下文,索引){
退货(
名称:产品[索引]['name'],
图片:产品[索引]['image'],
旧价格:产品[指数][“旧价格”],
最终价格:产品[指数][价格],
);
},
);
}
}
类产品扩展了无状态小部件{
产品({this.name,this.image,this.oldPrice,this.finalPrice});
最后的字符串名,图像;
最终国际原价,最终价格;
@凌驾
小部件构建(构建上下文){
回程卡(
孩子:英雄(
标签:姓名,
儿童:材料(
孩子:InkWell(
onTap:(){},
孩子:格子(
页脚:容器(
颜色:颜色,白色,
孩子:ListTile(
前导:文本(
名称
样式:TextStyle(
fontWeight:fontWeight.bold,
),
),
),
),
子:Image.asset(
形象,,
适合:BoxFit.cover,
),
),
),
),
),
);
}
}
尝试将GridView
的包覆面收缩
属性设置为true
,以便只占用基于其项目所需的空间:
我以您的代码为例添加了一个演示:
返回GridView.builder(
itemCount:products.length,
包覆面提取:true,//换行
物理:NeverScrollableScrollPhysics(),//新行
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
),
itemBuilder:(上下文,索引){
退货(
名称:产品[索引]['name'],
图片:产品[索引]['image'],
旧价格:产品[指数][“旧价格”],
最终价格:产品[指数][价格],
);
},
);
编辑:为了防止
网格视图
在列表视图
中单独滚动,将GridView
的physics
设置为NeverScrollablePhysics
是否为horizontalllist
另一个水平滚动的ListView
?出现此问题的原因是您将GridView放在ListView中。ListView/Gridview具有无限高。这意味着您将一个无限小部件推到另一个无限小部件中。这是错误的。首先,您需要确定Gridview的高度。但我认为这里可能会出现另一个问题。网格视图也可以滚动和ListView。(嵌套滚动)所以我认为这里最好的解决方案是:你可以使用CustomscrollView或NestesScrollView代替ListView,并且必须确定网格视图的大小。如果我的回答帮助你解决了文章中指定的问题,请接受并投票@阿曼