Flutter:如何使用动画移动到ListView中的最后一个位置[重复]

Posted

技术标签:

【中文标题】Flutter:如何使用动画移动到ListView中的最后一个位置[重复]【英文标题】:Flutter: How to move to the last position in a ListView with animation [duplicate] 【发布时间】:2021-02-18 18:37:18 【问题描述】:

我正在用颤振构建一个大奖游戏。实际上,我有一个带有累积奖金背景的堆栈和 3 个随 Timer.periodic 变化的图像资产。

我想通过动画改变让事情变得更漂亮。我最初的方法是使用无限的 ListView,它会不断添加元素并每次移动到列表的最后一个位置。

我怎样才能做到这一点?

这是我构建 Jackpot 的代码部分:

class Jackpot extends StatelessWidget 
  final List<String> imgUri;

  Jackpot(this.imgUri);

  @override
  Widget build(BuildContext context) 
    return Container(
      child: Expanded(
        flex: 0,
        child: Stack(
          children: [
            Image.asset(
              'src/images/jackpot_long_500.gif',
              height: 300,
              width: 700,
              fit: BoxFit.fill,
            ),
            Positioned(
              left: 35,
              top: 60,
              child: Image.asset(
                imgUri[0],
                height: 180,
                width: 200,
                fit: BoxFit.fill,
              ),
            ),
            Positioned(
              left: 256,
              top: 60,
              child: Image.asset(
                imgUri[1],
                height: 180,
                width: 200,
                fit: BoxFit.fill,
              ),
            ),
            Positioned(
              left: 470,
              top: 60,
              child: Image.asset(
                imgUri[2],
                height: 180,
                width: 200,
                fit: BoxFit.fill,
              ),
            ),
          ],
        ),
      ),
    );
  

这是更改图像的代码:

_startAnimations(GameArguments args) 
    Timer.periodic(
      Duration(milliseconds: 100),
      (Timer t) 
        print(t.tick);
        setState(() 
          index1 = _random.nextInt(10);
          index2 = _random.nextInt(10);
          index3 = _random.nextInt(10);
          if (t.tick == 50) 
            winner = _random.nextInt(10);
            print('reached t tick = 50');
            index1 = winner;
            index2 = winner;
            index3 = winner;
            t.cancel();
            print(args);
            _applyDesc(args);
            Timer(Duration(seconds: 1), () => _showMyDialog());
          
        );
      ,
    );
  

我知道这是重复的并且充满了不良做法。我只是在测试一些功能。

提前感谢您的帮助!

【问题讨论】:

***.com/questions/43485529/… 【参考方案1】:

如果您需要在添加元素后为屏幕设置动画 按按钮(示例)。

那么,

首先是定义列表的滚动控制器。

  ScrollController _scrollController = new ScrollController();

如果您使用的是 SingleChildScrollView,

 body: SingleChildScrollView(
        controller: _scrollController,

如果您使用的是 ListView,

body: ListView(
            controller: _scrollController,

那么,

RaisedButton(
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
  onPressed: () 
 setState(() 
        _scrollController.animateTo(
          _scrollController.position.maxScrollExtent,
          duration: Duration(seconds: 1),
          curve: Curves.fastOutSlowIn,
        );
      );
     ,
  child: Text("Move To Last"),
)

【讨论】:

【参考方案2】:

创建一个滚动控制器

final _controller = ScrollController();

将此分配给 ListView 的控制器属性

ListView.builder(
                    
                    controller: _controller,

使用动画动画到最后一个位置的代码。

_controller.animateTo(
                      _controller.position.maxScrollExtent,
                      curve: Curves.easeOut,
                      duration: const Duration(milliseconds: 500),
                    );

【讨论】:

以上是关于Flutter:如何使用动画移动到ListView中的最后一个位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中将 Hero 动画添加到我的 ListView?

Flutter listview下拉刷新,上拉加载更多封装

Flutter:在 ListView 中动画项目删除

Flutter - 选定的项目移动到 ListView 的顶部

Flutter:在动画的、定位的容器中获取 ListView,作为堆栈的一部分

Flutter Listview 排序动画