Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:如何制作一个总是滚动到底的列表?_Flutter - Fatal编程技术网

Flutter 颤振:如何制作一个总是滚动到底的列表?

Flutter 颤振:如何制作一个总是滚动到底的列表?,flutter,Flutter,我试图制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底 如何做到这一点?我可以通过使用定时器来实现这一点,但可能应该有更好的方法。 我的解决办法是: 定义一个ScrollController()并将其附加到listView: 覆盖页面initState方法,并在其中设置计时器,如下所示: 定义一个方法\u scrollToBottom(),该方法调用: \u scrollController.jumpTo(\u scrollController.position.maxScrol

我试图制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底


如何做到这一点?

我可以通过使用
定时器来实现这一点,但可能应该有更好的方法。
我的解决办法是:

  • 定义一个
    ScrollController()
    并将其附加到listView:
  • 覆盖页面
    initState
    方法,并在其中设置计时器,如下所示:
  • 定义一个方法
    \u scrollToBottom()
    ,该方法调用:

    \u scrollController.jumpTo(\u scrollController.position.maxScrollExtent)


  • 在小部件上设置
    reverse:true
    ,并反转子列表

    ListView(
    //默认情况下,“开始”滚动到底部,并停留在那里。
    相反:是的,
    children:widget.children.reversed.toList(可增长:false),
    ),
    
    如果您有一个很长的列表,并且反向开销很大,则可以使用ListView.builder反向索引而不是整个列表

    ListView.builder(
    相反:是的,
    itemCount:items.length,
    itemBuilder:(上下文,索引){
    最终反向索引=items.length-1-索引;
    最终项目=项目[反向索引];
    返回MyWidget(项目);
    }
    )
    

    我是从甘特上面的评论中得到的。谢谢

    我发现
    WidgetsBinding.instance.addPostFrameCallback
    在很多情况下都非常有用,比如您需要一些后期生成处理。在这种情况下,它解决了以下问题

    (1) 定义滚动控制器
    final ScrollController_sc=ScrollController()

    (2) 在ListView生成器中添加以下语句:

    WidgetsBinding.instance.addPostFrameCallback((_) => {_sc.jumpTo(sc.position.maxScrollExtent)});
    
    (3) 在ListView参数中包括参数
    控制器:_sc,


    我还构建了一个日志查看器。工作起来就像一个冠军。

    添加
    反向:true
    (并以相反的顺序添加项目)我尝试过,但几乎不可能以相反的顺序添加iTen,因为“ReplaySubject”对此没有任何方法=(为什么需要计时器?只有在有新日志时才可以使用.jumpTo..My position对象始终为空,我已将其附加到SingleChildsCallView。您能帮助我理解为什么会出现这种情况吗?M.Leonhard的答案更清晰。您可以避免处理有状态的小部件、计时器、记住取消它们等等。添加了编辑关于如何使用
    ListView.builder
    来完成sameThanks!对我来说,列表很长,我的列表是一个带有标题的粘性列表,我使用了一个映射从键中获取标题,从值中获取列表项(这是一个列表)。此解决方案最适合我。仅供参考,SchedulerBinding.instance.addPostFrameCallback((){controller1.animateTo(controller1.position.maxScrollExtent,持续时间:常量持续时间(毫秒:10),curve:Curves.easeOut,;})}对我不起作用。它只是将我的列表滚动了一半。这将颠倒列表中项目的顺序,将最后一项放在前面,第一项放在最后。它实际上不会显示底部。它将在切换项目时显示顶部。对我来说,这很好。对我来说,我认为这应该标记为正确答案。何时一旦建立了列表,它就会显示列表的底部。不需要定时器。谢谢。我总是寻找最少的运动部件来阻止墨菲。我认为这是最有效的方法。是的,这很好…这应该是公认的答案…非常整洁和清晰
     @override
      void initState() {
          super.initState();
          Timer.periodic(Duration(milliseconds: 100), (timer) {
            if (mounted) {
                _scrollToBottom();
            } else {
              timer.cancel();
            }
          });
        }
    
    WidgetsBinding.instance.addPostFrameCallback((_) => {_sc.jumpTo(sc.position.maxScrollExtent)});