如何处理Flutter中ListView的呈现错误

时间:2019-02-19 03:04:05

标签: dart flutter rendering

在我的屏幕上,我有一列,并且该列有一个ListView和一个文本字段。
就像与NPC聊天一样,因此,如果用户输入所有答案,则文本字段将变为按钮。
此时,出现渲染错误,我不知道问题出在哪里。

这是它的外观:

What I'm doing in gif

我的实现的部分代码如下。

return Column(
  children: <Widget>[
    Flexible(
      child: ListView.builder(
        scrollDirection: Axis.vertical,
        physics: const AlwaysScrollableScrollPhysics(),
        padding: const EdgeInsets.symmetric(horizontal: 20.0,vertical: 30.0),
        itemCount: widgets.length,
        itemBuilder: (context,index) => widgets[index],
        controller: _scrollController,
      ),
    ),
    state.showSubmitButton 
    ? Padding(
        padding: const EdgeInsets.only(bottom: 20.0),
        child: PrimaryButton(
          color: primaryBeige,
          text: 'Submit',
          callback: ()=>_tagChatBloc.emitEvent(TagChatEventComplete())
        )
      ) 
    : (state.isDetailStoreLoading 
      ? Padding(
          padding: const EdgeInsets.only(bottom: 20.0),
          child: CustomProgressIndicator()
        )
      : TagChatInput(scrollController: _scrollController)
    )
  ],
);

错误

  

I / flutter(32685):══╡渲染库引起的异常CA ══════════════════════════   I / flutter(32685):在performLayout()期间引发了以下断言:   I / flutter(32685):RenderViewport超过了其最大布局周期数。   I / flutter(32685):在布局期间,RenderViewport渲染对象可以重试它们的碎片或碎片   I / flutter(32685):ViewportOffset决定应该更正偏移量,以考虑到收集到的信息   I / flutter(32685):在该布局期间。   I / flutter(32685):但是,在此RenderViewport对象的情况下,发生了10次,但仍然没有   I / flutter(32685):关于滚动偏移量的共识。这通常表明存在错误。具体来说,这意味着   I / flutter(32685):RenderViewport对象遇到以下三个问题:   I / flutter(32685):* RenderSliv​​er子级或ViewportOffset之一存在一个错误,使他们始终认为   I / flutter(32685):无论如何,他们都需要校正偏移量。   I / flutter(32685):* RenderSliv​​er子级和ViewportOffset的某些组合存在不良交互,例如   I / flutter(32685):一个应用校正,然后另一个应用反向校正,导致无穷大   I / flutter(32685):更正循环。   I / flutter(32685):*有一种病理情况最终会解决,但它是如此复杂以至于   I / flutter(32685):无法通过任何合理数量的布局传递来解决。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

Flutter布局管理器不知道将列表视图扩展到多远,因为它一直在进行并且从未找到停止点。

以下是构建消息传递UI的一些步骤:

  1. 将您的列mainAxisSize设置为MainAxisSize.max

  2. 将列表视图放入其中包含容器的扩展窗口小部件中。因此,您将拥有:

    • 展开

      • 容器

        • ListView
  3. 将“消息框UI”包装在固定高度的容器中,以便“扩展的”可以停下来,并将其添加为列表的最后一个子项,并使用上述条件来做到这一点。

最后你应该拥有

Column: MainAxisSize.max
  Expanded
    Container: No given size
      ListView
  Container: Fixed height (For Messages input UI and your button)

这将产生一个聊天UI。这就是我最近实现相同接口的方式。确保您的条件替换固定容器的子容器,而不是容器本身。

答案 1 :(得分:0)

较低的版本将引发此异常。在我的Flutter应用中,1.1.5失败,1.5.4成功。

或者您可以在目录:packages\flutter\lib\src\rendering\sliver_list.dart.

中更改浮动源代码。

详细信息在下面的链接中:

https://github.com/flutter/flutter/issues/29852