Flutter布局对象(RenderObject)断言失败。

5

我遇到了以下错误:

======== Exception caught by scheduler library =====================================================
The following assertion was thrown during a scheduler callback:
Updated layout information required for RenderIndexedSemantics#f51aa NEEDS-LAYOUT to calculate semantics.
'package:flutter/src/rendering/object.dart':
Failed assertion: line 2658 pos 12: '!_needsLayout'


Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=2_bug.md

When the exception was thrown, this was the stack: 
#2      RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:2658:12)
#3      RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:2680:61)
#4      Iterable.forEach (dart:core/iterable.dart:257:30)
#5      RenderSliverVariableSizeBoxAdaptor.visitChildren (package:flutter_staggered_grid_view/src/rendering/sliver_variable_size_box_adaptor.dart:296:29)
#6      RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:2765:5)
...
====================================================================================================

我想知道这是什么意思,通常在什么情况下发生?
我正在使用flutter_staggered_grid_view: ^0.4.0
如有必要,我将创建一个GitHub问题。
编辑: 以下是一段代码以突出显示该问题:
我的主Widget通过以下方式呈现:
StaggeredGridView.countBuilder(
      itemBuilder: (BuildContext context, int index) {
        return MyCustomItem();
      },
      padding: EdgeInsets.only(left: Constants.maxWidth*2/100, right: Constants.maxWidth*2/100,
          bottom: Constants.maxHeight*10/100 + 65), // home button size + margin bottom
      crossAxisCount: 2,
      mainAxisSpacing: 20,
      crossAxisSpacing: Constants.maxWidth*2/100,
      itemCount: 30,
      physics: BouncingScrollPhysics(),
      staggeredTileBuilder: (int index) {
        return StaggeredTile.fit(1);
      },
    ),

一个由MyCustomItem Widget组成的列表中的每个项目:

Column(
      children: [
        GestureDetector(
          child:
          Container(
            margin: (widget.index == 0 || widget.index == 1) ? EdgeInsets.only(top: Constants.maxHeight*6/100+60) : EdgeInsets.all(0),
            //width: postWidth,
            // TODO : post height
            child: ClipRRect(
              borderRadius: BorderRadius.all(Radius.circular(20)),
              child: Image.asset("assets/images/test.jpg"), // TODO 
            ),
          ),
          onTap: () {
            // TODO
          },
          onDoubleTap: () {
            // TODO
          },
        ),
        Row(
          children: [
            Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisSize: MainAxisSize.min,
              children: [
                GestureDetector(child:
                Container(
                  margin: EdgeInsets.only(top: 10, bottom: 3),
                  width: 35,
                  height: 35,
                ),
                  onTap: () {
                    // TODO 
                  },
                ),
                Flexible(child:
                Container(
                  width: Constants.maxWidth*25/100,
                  child:
                  Text(
                    "tessssst",
                    textAlign: TextAlign.center,
                    overflow: TextOverflow.ellipsis,
                    style: TextStyle(
                      fontSize: 14,
                      fontWeight: FontWeight.bold,
                      color: Color(resColors.getShadow()),
                    ),
                    maxLines: 1,
                  ),
                ),
                ),
              ],
            ),
            Spacer(),
            Container(
              margin: EdgeInsets.only(right: Constants.maxWidth * 2 / 100),
              child: Column(children: [
                Container(
                  margin: EdgeInsets.only(bottom: 3, top: 10),
                  child: InkWell(
                    onTap: () {
                      // TODO
                    },
                    highlightColor: Colors.transparent,
                    splashColor: Colors.transparent,
                  ),
                ),
                Text("1029"),
              ]),
            ),
            Container(
              child: Column(children: [
                Container(
                  margin: EdgeInsets.only(bottom: 3, top: 10, right: Constants.maxWidth/100),
                  child: InkWell(
                    onTap: () => {},// TODO
                    highlightColor: Colors.transparent,
                    splashColor: Colors.transparent,
                  ),
                ),
                Text("Test"),
              ]),
            ),
          ],
        )
      ],
    );

我想补充一点,如果MyCustomItem只是一个 Text Widget,我就不会出现错误。

1
请展示你的代码。 - Andrej
是的,你说得对,我应该把它放在第一位。我已经编辑过了。 - Tom3652
你尝试过不使用GridView包吗? - Andrej
它可以与ListView.builder一起使用,也可以与GridView.builder一起使用。但不能与StaggeredGridView一起使用。 虽然存在此错误,但似乎不会影响我的应用程序UI,因为我拥有所需的渲染,并且无论如何都可以正常工作...(使用StaggeredGridView.builder - Tom3652
1个回答

1
现在你可以使用正在测试中的flutter_staggered_grid_view仓库的新分支,但它已经为我解决了这个问题。 该插件的所有者表示,这是一个完全重构的插件,修复了许多错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接