当前位置: 首页 > 知识库问答 >
问题:

不能在标准的ListView小部件上滚动;总是过度渲染150px

公良理
2023-03-14

列表视图根本不会滚动。错误表示问题出在main.dart文件中,而不是我正在处理的模块中,但这是模块溢出。

尝试了多种方法:

  • 主:false,物理:const AlwaysScrollableScroll物理(),控制器:_controller
  • 关于制作列表视图的Flutter开发文档
  • 关于制作列表视图的中等帖子
  • 无数堆栈溢出Qs

这是我的代码:

import 'package:flutter/material.dart';

class Listicle extends StatefulWidget {
  @override
  ListicleState createState() => ListicleState();
}

class ListicleState extends State<Listicle> {
  final List<String> entries = <String>['A', 'B', 'C', 'D', 'E', 'F'];
  final List<int> colorCodes = <int>[600, 500, 100, 600, 500, 100];

  ScrollController _controller = new ScrollController();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: ListView.builder(
        primary: false,
        physics: const AlwaysScrollableScrollPhysics(),
        controller: _controller,
        shrinkWrap: true,
        padding: const EdgeInsets.all(8),
        itemCount: entries.length,
        itemBuilder: (BuildContext context, int index) {
          return Container(
            height: 100,
            color: Colors.amber[colorCodes[index]],
            child: Center(child: Text('Entry ${entries[index]}')),
          );
        }
      )
    );
  }
}

以下是错误:

════════ Exception caught by rendering library ═════════════════════════════════════════════════════
The following assertion was thrown during layout:
A RenderFlex overflowed by 150 pixels on the bottom.

The relevant error-causing widget was: 
  Column file:///Users/christopher/AndroidStudioProjects/test_app/lib/main.dart:76:13
The overflowing RenderFlex has an orientation of Axis.vertical.
The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and black striped pattern. This is usually caused by the contents being too big for the RenderFlex.

Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the RenderFlex to fit within the available space instead of being sized to their natural size.
This is considered an error condition because it indicates that there is content that cannot be seen. If the content is legitimately bigger than the available space, consider clipping it with a ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex, like a ListView.

The specific RenderFlex in question is: RenderFlex#c9341 relayoutBoundary=up1 OVERFLOWING
...  needs compositing
...  parentData: offset=Offset(0.0, 80.0); id=_ScaffoldSlot.body (can use size)
...  constraints: BoxConstraints(0.0<=w<=392.7, 0.0<=h<=679.3)
...  size: Size(392.7, 679.3)
...  direction: vertical
...  mainAxisAlignment: start
...  mainAxisSize: max
...  crossAxisAlignment: center
...  verticalDirection: down
◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤
════════════════════════════════════════════════════════════════════════════════════════════════════

我对飞镖/飞镖非常陌生(从昨天开始),这已经让我感到困惑。

这是一张快照:https://i.stack.imgur.com/qlDMZ.png

共有2个答案

江航
2023-03-14

发生错误是因为ListView在主轴方向上扩展到最大大小。

解决方案:

正如@rocigno medeiros在评论中正确地说的那样

通过在Scaffold中包装代码,可以使其工作,因为Scaffold限制了ListView的高度。

class Listicle extends StatefulWidget {
  @override
  ListicleState createState() => ListicleState();
}

class ListicleState extends State<Listicle> {
  final List<String> entries = <String>['A', 'B', 'C', 'D', 'E', 'F'];
  final List<int> colorCodes = <int>[600, 500, 100, 600, 500, 100];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: ListView.builder(
          primary: false,
          physics: AlwaysScrollableScrollPhysics(),
          shrinkWrap: true,
          padding: const EdgeInsets.all(8),
          itemCount: entries.length,
          itemBuilder: (BuildContext context, int index) {
            return Container(
              height: 100,
              color: Colors.amber[colorCodes[index]],
              child: Center(child: Text('Entry ${entries[index]}')),
            );
          },
        ),
      ),
    );
  }
}

如果你想要默认的滚动行为,也不需要额外的滚动控制器。

更多信息和一个伟大的答案在这里。

庄阿苏
2023-03-14

这工作:

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Listicle(),
        ),
      ),
    );
  }
}

class Listicle extends StatefulWidget {
  @override
  ListicleState createState() => ListicleState();
}

class ListicleState extends State<Listicle> {
  final List<String> entries = <String>['A', 'B', 'C', 'D', 'E', 'F','G','H'];
  final List<int> colorCodes = <int>[600, 500, 100, 600, 500, 100,100,100];

 @override
  Widget build(BuildContext context) {
    return Container(
      child: ListView.builder(
        primary: false,
        shrinkWrap: true,
        padding: const EdgeInsets.all(8),
        itemCount: entries.length,
        itemBuilder: (BuildContext context, int index) {
          return Container(
            height: 100,
            color: Colors.amber[colorCodes[index]],
            child: Center(child: Text('Entry ${entries[index]}')),
          );
        }
      )
    );
  }
}
 类似资料:
  • 问题内容: 我有一个问题,我不知道如何解决。在我的react组件中,我在底部显示一长串数据和少量链接。单击任何此链接后,我将在列表中添加新的链接集合,并需要滚动到顶部。 问题是- 呈现新集合 后 如何滚动到顶部? 问题答案: 由于原始解决方案是为 react的 早期版本提供的,因此这里进行了更新:

  • 问题内容: 我有一个带有onScrollStateChanged和onScroll事件侦听器的ListView。我希望能够获得ListView的滚动速度,或者以某种方式在某个事件侦听器中获得已启动滚动的finalX位置。我们的应用定位到SDK版本7。 我需要测量或获取ListView滚动的速度。 问题答案: 划分第一个可见项时差对时差不是一个好的解决方案。OnScroll侦听器每隔固定的时间周期接

  • 我有一个问题,我没有办法解决。在react组件中,我在底部显示了一长串数据和几个链接。在点击任何一个链接后,我用新的链接集合填写列表,并需要滚动到顶部。 问题是-呈现新集合后如何滚动到顶部?

  • 当我单击移动视图中的一个链接时,它会为产品详细信息页面呈现一个新组件。 然而,渲染的视图总是从底部开始。. 如何更改此选项以始终从顶部显示新组件??

  • Renders中间件是一个Go模板引擎的 Tango 中间件。 安装 go get github.com/tango-contrib/renders 示例 type RenderAction struct { renders.Renderer } func (x *RenderAction) Get() { x.Render("test.html", renders.T{

  • 问题内容: 每次在React.js中执行渲染时,UI都会滚动到页面顶部。 JSFiddle:http : //jsfiddle.net/bengrunfeld/dcfy5xrd/ 有什么漂亮或 反应性的 方式可以阻止这种情况吗? 例如,如果用户向下滚动页面,然后按下导致渲染的按钮,则UI将保持与以前相同的滚动位置。 更新:为什么UI滚动到某些渲染的顶部,而不滚动到其他渲染? 问题答案: @floy