Listview 如何防止颤振列表视图中的动画小部件一起移动

Listview 如何防止颤振列表视图中的动画小部件一起移动,listview,animation,flutter,Listview,Animation,Flutter,我有一个问题,我开始在我的listview平铺中添加前导图标,然后想给它们设置动画。我能够跟随动画足够让他们开始制作onTap动画,但他们都一起制作动画。我如何使它们独一无二?我试图向AnimatedWidget构造函数传递一个键,但这似乎没有帮助 下面是演示我当前问题的代码。如果你轻按,它们都会旋转90度,如果你长按,它们会向后移动90度 import 'package:flutter/material.dart'; import 'dart:math'; void main() =>

我有一个问题,我开始在我的listview平铺中添加前导图标,然后想给它们设置动画。我能够跟随动画足够让他们开始制作onTap动画,但他们都一起制作动画。我如何使它们独一无二?我试图向AnimatedWidget构造函数传递一个键,但这似乎没有帮助

下面是演示我当前问题的代码。如果你轻按,它们都会旋转90度,如果你长按,它们会向后移动90度

import 'package:flutter/material.dart';
import 'dart:math';

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  int _counter = 0;
  AnimationController controller;
  Animation animation;

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();

    controller =
        AnimationController(duration: const Duration(milliseconds: 285), vsync: this);
    animation = Tween<double>(begin: 0, end: pi/2).animate(controller);

  }


  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
            child: ListView(
              children: ListTile.divideTiles(
                context: context,
                tiles: [
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Sun'),
                  ),
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Moon'),
                  ),
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Star'),
                  ),
                ],
              ).toList(),
            ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class AnimatedChevron extends AnimatedWidget {
  AnimatedChevron({Key key, Animation<double> animation})
      : super(key: key, listenable: animation);

  Widget build(BuildContext context) {
    final Animation<double> animation = listenable;
    return Transform.rotate(
        angle: animation.value,
        child: Icon(Icons.chevron_right, color: Colors.blue));
  }
}
导入“包装:颤振/材料.省道”;
导入“dart:math”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState使用SingleTickerProviderStateMixin扩展状态{
int _计数器=0;
动画控制器;
动画;
@凌驾
无效处置(){
controller.dispose();
super.dispose();
}
@凌驾
void initState(){
super.initState();
控制器=
AnimationController(持续时间:常量持续时间(毫秒:285),vsync:this);
动画=Tween(开始:0,结束:pi/2)。动画(控制器);
}
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:ListView(
子项:ListTile.divideTiles(
上下文:上下文,
瓷砖:[
列表砖(
前导:动画雪佛龙(动画:动画),
onTap:()=>controller.forward(),
onLongPress:()=>controller.reverse(),
标题:文本(“Sun”),
),
列表砖(
前导:动画雪佛龙(动画:动画),
onTap:()=>controller.forward(),
onLongPress:()=>controller.reverse(),
标题:文本(“月亮”),
),
列表砖(
前导:动画雪佛龙(动画:动画),
onTap:()=>controller.forward(),
onLongPress:()=>controller.reverse(),
标题:文本(‘星’),
),
],
).toList(),
),
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
类AnimatedChevron扩展AnimatedWidget{
AnimatedChevron({Key,Animation Animation})
:super(关键点:关键点,可收听:动画);
小部件构建(构建上下文){
最终动画=可收听;
返回Transform.rotate(
角度:animation.value,
子:图标(Icons.chevron_right,颜色:Colors.blue));
}
}


我在这里用的另一个。

每个项目必须有一个animationController好的,我可以试试。但是如果我用一个列表生成器来构建列表呢?我如何在ListView.builder()中创建一个新的animationController?好的,通过对animationController的映射来实现这一点,因为我需要一种通过id引用它们的方法(因此映射)。然后,我必须通过在地图的最后一步来处理它们。看起来有点资源密集,但也许没问题。对于我的中等大小的列表,它运行得非常好。有没有任何性能化的方法来处理大列表?每个项目必须有一个animationController好的,我可以试试。但是如果我用一个列表生成器来构建列表呢?我如何在ListView.builder()中创建一个新的animationController?好的,通过对animationController的映射来实现这一点,因为我需要一种通过id引用它们的方法(因此映射)。然后,我必须通过在地图的最后一步来处理它们。看起来有点资源密集,但也许没问题。对于我的中等规模的列表,它工作得非常好。有没有一种有效的方法来处理大型列表?