如何自动滚动到网格视图的末尾?

2024-03-24

当我将项目添加到网格视图的末尾时,我希望用户看到已添加的内容。这是我的意思的一个例子:

用户通过按 + 图标添加项目。问题是在第 14 项之后没有任何反馈表明已添加任何项目。当最后一项添加到列表中时,如何自动滚动到最后一项?

(奖励点:当第 n 个项目添加到列表中间的某个位置时,如何滚动到第 n 个项目)

这是滚动到列表视图末尾的答案 https://stackoverflow.com/questions/43485529/programmatically-scrolling-to-the-end-of-a-listview,但是如果我颠倒列表的顺序,那么有时顶行会出现“丢失”的项目,这看起来会很奇怪。

这是我的代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  @override
  Widget build(BuildContext context) {
    List items = [];
    for (int i = 0; i < _counter; i++) {
      items.add(new Text("Item $i"));
    }
    return new Scaffold(
      appBar: new AppBar(title: new Text("Scroll To End Test")),
      body: new GridView.extent(
        primary: true,
        maxCrossAxisExtent: 150.0,
        children: items,
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          setState(() {
            _counter++;
          });
        },
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ),
    );
  }
}

声明一个滚动控制器并使用它移动到您想要的点。这是滚动到最后一个元素的示例。请注意,滚动控制器是显式声明的,因此您不能发出primary: true

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  ScrollController _scrollController;                                 // NEW

  @override                                                           // NEW
  void initState() {                                                  // NEW
    super.initState();                                                // NEW
    _scrollController = new ScrollController(                         // NEW
      initialScrollOffset: 0.0,                                       // NEW
      keepScrollOffset: true,                                         // NEW
    );
  }

  void _toEnd() {                                                     // NEW
    _scrollController.animateTo(                                      // NEW
      _scrollController.position.maxScrollExtent,                     // NEW
      duration: const Duration(milliseconds: 500),                    // NEW
      curve: Curves.ease,                                             // NEW
    );                                                                // NEW
  }                                                                   // NEW

  @override
  Widget build(BuildContext context) {
    List items = [];
    for (int i = 0; i < _counter; i++) {
      items.add(new Text("Item $i"));
    }
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Scroll To End Test"),
        actions: <Widget>[                                            // NEW
          new IconButton(                                             // NEW
              icon: new Icon(Icons.arrow_downward), onPressed: _toEnd)// NEW
        ],                                                            // NEW
      ),
      body: new GridView.extent(
        //primary: true, // REMOVED
        maxCrossAxisExtent: 150.0,
        children: items,
        controller: _scrollController,                                // NEW
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          setState(() {
            _counter++;
          });
        },
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ),
    );
  }
}

关于“奖励点”,我对 ScrollController 不太熟练,但据我所知,.animateTo( )方法要求作为双精度的第一个输入,在那里设置滚动点:原则上,将i-th您想要滚动到的项目

var cursor = i/(# items) * _scrollController.position.maxScrollExtent

根据网格每行有多少个对象来调整此值。我知道这只是一个草图,但我认为它可以引导您到达那里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何自动滚动到网格视图的末尾? 的相关文章

随机推荐

  • c中int (*pt)[5]的含义是什么[重复]

    这个问题在这里已经有答案了 我读过一些关于这种类型声明的地方 声明是 int arr 5 我对这个类型声明有点困惑 实际上这个声明的含义是什么以及我们什么时候使用它 int arr 5 arr是 5 个指针的数组 int arr 5 arr
  • 组件、行为和 MonoBehaviour 之间有什么区别?为什么这些是分开的?

    MonoBehaviour延伸Behaviour and Behaviour延伸Component 我想知道为什么这些类被分开以及这些类的语义含义 区分这些类有什么目的吗 是否有任何课程延伸Behaviour or Component直接地
  • Youtube Api playVideo 方法在某些移动设备上不起作用

    我正在尝试创建一个移动网站 点击图像后可以播放 YouTube 视频 我已经在几款 Android 手机 版本上进行了测试 有些手机的行为与预期不符 我的意思是它停止在缓冲并且永远不会播放视频 我注意到的另一件事是 播放器在用户触发视频播放
  • Eclipse GridData 的垂直滚动条

    我在 Eclipse 应用程序中有以下 Java 代码 import org eclipse swt layout GridData import org eclipse swt widgets List import org eclips
  • 如何从我的 Subversion 托管帐户创建转储文件?

    我的 SVN 存储库托管在某处 我想搬到别人那里去 如何创建存储库的转储以便将其导入到我的新主机中 这就是我一直看到的 svnadmin dump path to repos gt repos dump 我的存储库是托管的 因此它不是本地的
  • 在单独的函数中修改指向字符串文字的指针

    我希望这是一个微不足道的问题 有人可以用比我已经遇到的更简单的术语向我解释 在工作过程中 C 之旅 第二版 我一直在尝试几个例子 我目前正在尝试在单独的函数中修改指向字符串文字的指针 我认为这很容易 using namespace std
  • 小块饼图上的标签(ggplot)

    我想用ggplot制作饼图 My data lab lt c a b c d e f g h percentage lt c 50 20 10 10 2 2 2 2 df prison lt data frame lab percentag
  • 如何设置内联集合?

    例如 DataTable table new DataTable Columns new DataColumnCollection new DataColumn col1 new DataColumn col2 你说的是集合初始化器 htt
  • 完全用汇编语言编写操作系统有什么好处? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 MenuetOS http en wikipedia org wiki MenuetOS是完全用汇编编写的操作系统的示例 用汇编语言编写它比用
  • 在 Visual Basic 6 中对 Excel 工作表进行编码

    我想将excelsheet1的列A的值获取到Visual Basic的某个变量中 然后在更改该值后发送回下一个sheet2 这是一个完整且有效的项目示例 它将值从 Sheet1 单元格 A1 复制到 Sheet2 单元格 A1 declar
  • C# 中的空可扩展树节点

    我想在 C 中创建一个可扩展的空树节点 即一个空的树节点 旁边有 符号 原因是因为最初它是空的 但是一旦单击一个节点 我想用许多子节点填充它 我面临的唯一问题是空树节点不可扩展 所以我不知道该怎么办 有没有办法解决这个问题 或者有什么解决方
  • AF-XDP:实现共享 Umem 套接字

    我想实现 XDP SHARED UMEM https www kernel org doc html latest networking af xdp html xdp shared umem bind flag https www ker
  • c:out 和使用 $ 打印输出之间的区别

    在 JSTL 中有两种打印输出的方法 h1 h1
  • hh_client 报告包错误

    我正在按照中的说明进行操作入门 https docs hhvm com hack getting started starting a real project在 Hacklang 官方网站上 正如它所说 我运行 touch hhconfi
  • 在包中包含一个“哈希表”

    我正在整理一个我已经工作了近一年的包 我有一个音节查找函数所需的哈希表 哈希表实际上只是一个环境 我想我不是计算机高手 它是一个查找表 您可以在下面看到我创建它的函数 我有一个数据集DICTIONARY 约 20 000 个字 将在加载包时
  • 在JAVA中从字符串(从url类型更改)中删除尾部斜杠

    我想从 Java 中的字符串中删除尾部斜杠 我想检查字符串是否以 url 结尾 如果是 我想删除它 这是我所拥有的 String s http almaden ibm com s s replaceAll 和这个 String s http
  • 使用 jQuery 创建新的 html5 视频对象

    如何使用 jQuery 创建视频元素 并将其属性 例如 control 添加到 true
  • Python 和 MySQL:有 MySQLdb 的替代品吗?

    是否有一个纯粹用 Python 编写的模块允许脚本与 MySQL 数据库通信 我已经尝试过 MySQLdb 但没有成功 它需要太多 GCC zlib 和 openssl 我无法使用这些工具 即使我这样做了 我也不想浪费时间让他们一起工作 我
  • 使用Camel的spring-rabbitmq组件时如何自动声明交换?

    我正在尝试从 Camel 3 x 迁移到 Camel 4 x 版本 因此我需要从rabbitmq替换组件spring rabbitmq With rabbitmq我正在使用的组件declare https camel apache org
  • 如何自动滚动到网格视图的末尾?

    当我将项目添加到网格视图的末尾时 我希望用户看到已添加的内容 这是我的意思的一个例子 用户通过按 图标添加项目 问题是在第 14 项之后没有任何反馈表明已添加任何项目 当最后一项添加到列表中时 如何自动滚动到最后一项 奖励点 当第 n 个项