错误:未布置 RenderBox,断言失败:第 1940 行 pos 12:'hasSize'

Posted

技术标签:

【中文标题】错误:未布置 RenderBox,断言失败:第 1940 行 pos 12:\'hasSize\'【英文标题】:Error: RenderBox was not laid out, Failed assertion: line 1940 pos 12: 'hasSize'错误:未布置 RenderBox,断言失败:第 1940 行 pos 12:'hasSize' 【发布时间】:2021-08-19 00:19:06 【问题描述】:

我无法修复此错误

RenderBox 未布局:RenderPointerListener#2b92a relayoutBoundary=up9 需要-油漆需要-合成-位-更新 'package:flutter/src/rendering/box.dart':断言失败:第 1940 行 位置 12:'hasSize'。相关的导致错误的小部件是 ->ListView

这是我的 allProducts 部分。

import 'package:flutter/material.dart';
import 'package:hospital/Drawer/drawercontent.dart';
import 'package:hospital/Product/AllProducts/ProductList/product_list.dart';
import 'package:hospital/Product/AllProducts/carousel.dart';
import 'package:hospital/Product/AllProducts/category.dart';

class AllProducts extends StatefulWidget 
  @override
  _AllProductsState createState() => _AllProductsState();


class _AllProductsState extends State<AllProducts> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.green,

          title: Text(
            "Product",
            style: TextStyle(fontStyle: FontStyle.italic),
          ),
          actions: [

            IconButton(
              icon: Icon(Icons.person),
              onPressed: () => print("open cart"),
            ),
          ],

        ),
        drawer: Drawer(
          child: DrawerContent(),
        ),
        body: ListView(

          children: [
            Carousel(),
            SizedBox(
              height: 10.0,
            ),

            CategoryPage(),
            SizedBox(
              height: 20.0,
            ),
            ProductList()

          ],
        ));
  


这是我的产品部分

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:hospital/Product/AllProducts/ProductList/network_req.dart';
import 'package:hospital/Product/AllProducts/ProductList/product_model.dart';
import 'package:hospital/constant.dart';
import 'package:http/http.dart' as http;
// import '../../drawercontent.dart';

class ProductList extends StatefulWidget 
  final s_id;

  const ProductList(key, this.s_id) : super(key: key);
  @override
  _ProductListState createState() => _ProductListState();


class _ProductListState extends State<ProductList> 
  @override
  Widget build(BuildContext context) 
    return Container(
      // ignore: missing_required_param
      child: FutureBuilder<List<Model>>(
        // future: NetReq.fetchTeams(),
        future: NetReq.fetchTeams(widget.s_id),

        builder: (context, snapshot) 
          if (snapshot.hasError) 
            return Text("Error $snapshot.error");
           else if (snapshot.hasData) 
            return GridView.count(

                // childAspectRatio: 1.0,
                padding: EdgeInsets.only(left: 20, right: 20),
                crossAxisCount: 2,
                crossAxisSpacing: 18,
                mainAxisSpacing: 18,

                children: snapshot.data.map((team) 
                  return Card(
                    elevation: 3.0,
                    margin: EdgeInsets.all(10.0),
                    shape: RoundedRectangleBorder(

                      borderRadius: BorderRadius.circular(12.0),
                    ),
                    child: Container(
                      width: 150.0,
                      padding: EdgeInsets.all(8.0),

                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Expanded(
                            child: ClipRRect(

                              borderRadius: BorderRadius.circular(14.0),
                              child: Container(
                                decoration: BoxDecoration(
                                  borderRadius: BorderRadius.circular(12.0),
                                  image: DecorationImage(
                                    image: NetworkImage(
                                        "https://5.imimg.com/data5/MR/TK/KJ/SELLER-769696/tulac-granules-500x500.jpeg"),
                                  ),

                                ),
                              ),
                            ),
                          ),
                          SizedBox(height: 12.0),

                          Text(
                              // "Tulac Granules, For Personal, Packaging Size: 90 Gm",
                              team.teamUniqId,
                              overflow: TextOverflow.ellipsis,
                              maxLines: 2,

                              style: kTitleStyle),
                          SizedBox(height: 6.0),
                          Text(
                              // "\u20B9 239/ Box",
                              team.teamType,

                              maxLines: 1,
                              style: kSubTitleStyle),
                        ],
                      ),
                    ),

                  );
                ).toList());
          
          return Center(
            child: CircularProgressIndicator(),

          );
        ,
      ),
    );

  


【问题讨论】:

【参考方案1】:

请像这样添加 GridView shrinkWrap: true:

返回 GridView.count( 收缩包装:真 填充:EdgeInsets.only(左:20,右:20), 交叉轴计数:2, 交叉轴间距:18, 主轴间距:18, );

【讨论】:

【参考方案2】:

当 ListView 没有限制高度时会发生这种情况,这使得它获得无限的高度,您可以使用两种解决方案来解决这个问题

    添加shrinkWrap: true作为参数 这将告诉 ListView 使用尽可能少的空间,

    使用限制高度的小部件(例如 SizedBoxContainer)包装您的 ListView,并为其指定高度和宽度

       Container(
            height: 50,
            width: 50,
            child: ListView()
              )

希望这能解决您的问题

【讨论】:

以上是关于错误:未布置 RenderBox,断言失败:第 1940 行 pos 12:'hasSize'的主要内容,如果未能解决你的问题,请参考以下文章

RenderBox 未布置:RenderFlex#4a60a 需要-油漆需要-合成-位-更新

Flutter:未布置RenderBox:RenderRepaintBoundary#58c65 relayoutBoundary = up1 NEEDS-PAINT

RenderBox 未布局,Flutter Listview Builder 未显示

Flutter:RenderBox 未布置:RenderRepaintBoundary#58c65 relayoutBoundary=up1 NEEDS-PAINT

引发了另一个异常: RenderBox 未布置:CustomRenderShrinkWrappingViewport#f6727 relayoutBoundary=up17 NEEDS-PAINT N

垂直视口被赋予了无限的高度。 RenderBox 未布置:RenderViewport#34d12 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UP