Dart 颤振-小部件动画状态即使在被删除后仍保持不变

Dart 颤振-小部件动画状态即使在被删除后仍保持不变,dart,flutter,Dart,Flutter,我正在更新列表磁贴,但即使在更新中,我删除了磁贴的一个元素,出现的元素的动画状态仍然处于活动状态 换句话说,我用this.tiles=buildTile(list)重做tiles动画状态不会更改 在下面的示例中,删除了文本中包含字符串foo3的小部件,但其动画仍在继续,而文本中包含字符串foo4的小部件接收此动画 有没有办法解决这个问题,或者这是一个bug 导入“包装:颤振/材料.省道”; 将“dart:ui”导入为ui; void main(){ runApp(新的MyApp()); } 类

我正在更新
列表磁贴
,但即使在更新中,我删除了
磁贴
的一个元素,出现的元素的动画状态仍然处于活动状态

换句话说,我用
this.tiles=buildTile(list)重做
tiles
动画
状态
不会更改

在下面的示例中,删除了文本中包含字符串
foo3
的小部件,但其动画仍在继续,而文本中包含字符串
foo4
的小部件接收此动画

有没有办法解决这个问题,或者这是一个bug

导入“包装:颤振/材料.省道”;
将“dart:ui”导入为ui;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
列出瓷砖;
列出foos=[];
@凌驾
void initState(){
this.foos=['foo1','foo2','foo3','foo4'];
this.tiles=buildTile(this.foos);
super.initState();
}
//作用
列表buildTile(列表列表){
var x=[];
对于(变量i=0;i新建ItemCategoryState();
}
类ItemCategoryState使用TickerProviderStateMixin扩展状态{
ItemCategoryState();
动画控制器_控制器;
动画(动画),;
双重闪避;
bool startFling=true;
void initState(){
super.initState();
_控制器=新的AnimationController(持续时间:
常量持续时间(毫秒:246),vsync:this;
_动画=新曲线动画(
父节点:_控制器,
曲线:新间隔(0.0,1.0,曲线:曲线。线性),
);
}
无效移动(DragUpdate详细信息){
最终双增量=细节。主增量/304;
_controller.value-=delta;
}
无效结算(DRAGENDETAILES){
如果(这个开始){
_控制器。投掷(速度:1.0);
this.startFling=false;
}否则如果(!this.startFling){
_控制器。投掷(速度:-1.0);
this.startFling=true;
}
}
@凌驾
小部件构建(构建上下文){
final ui.Size logicalSize=MediaQuery.of(context.Size);
最终双宽度=logicalSize.width;
this.flingOpening=-(48.0/_宽度);
返回新的手势检测器(
水平排水更新:_移动,
在水平方向:,
子:新堆栈(
儿童:[
新定位填充(
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
新容器(
装饰:新盒子装饰(
颜色:新颜色(0xFFE57373),
),
孩子:新的图标按钮(
图标:新图标(图标。删除),
颜色:新颜色(0xFFFFFF),
onPressed:widget.onPressed
)
),
],
),
),
新幻灯片转换(
职位:新吐温(
开始:Offset.zero,
结束:新偏移量(此为flingOpening,0.0),
).制作动画(_动画),
子容器:新容器(
装饰:新盒子装饰(
边界:新边界(
顶部:新的BorderSide(样式:BorderStyle.solid,颜色:Colors.black26),
),
颜色:新颜色(0xFFFFFF),
),
边距:仅限新边集(顶部:0.0,底部:0.0),
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.start,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
新扩展(
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
新容器(
边距:仅限新边集(左:16.0),
填充:仅限新边集(右:40.0,顶部:4.5,底部:4.5),
孩子:新的一排(
儿童:[
新容器(
边距:仅限新边集(右:16.0),
孩子:新图标(
图标。亮度_1,
颜色:颜色,黑色,
尺寸:35.0,
),
),
新文本(widget.category),
],
)
)
],
),
)
],
),
)
),
],
)
);
}
}

您需要将
钥匙
传递给您的孩子。或者是r
import 'package:flutter/material.dart';
import 'dart:ui' as ui;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  List<Widget> tiles;
  List foos = [];

  @override
  void initState() {
    this.foos = ['foo1', 'foo2', 'foo3', 'foo4'];
    this.tiles = buildTile(this.foos);
    super.initState();
  }

  //function
  List<Widget> buildTile(List list) {
    var x = [];
    for(var i = 0; i < list.length; i++) {
      x.add(
        new ItemCategory(
          key: new Key(list[i]), //new
          category: list[i],
          onPressed: () {
            setState(() {
              list.removeAt(i);
              this.tiles = buildTile(list);
            });
          },
        )
      );
    }
    return x;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Categories'),
      ),
      body: new ListView(
        padding: new EdgeInsets.only(top: 8.0, right: 0.0, left: 0.0),
        children: this.tiles
      )
    );
  }
}

class ItemCategory extends StatefulWidget {
  ItemCategory({ Key key, this.category, this.onPressed}) : super(key: key);

  final String category;
  final VoidCallback onPressed;

  @override
  ItemCategoryState createState() => new ItemCategoryState();
}

class ItemCategoryState extends State<ItemCategory> with TickerProviderStateMixin {
  ItemCategoryState();

  AnimationController _controller;
  Animation<double> _animation;
  double flingOpening;
  bool startFling = true;

  void initState() {
    super.initState();
    _controller = new AnimationController(duration: 
      const Duration(milliseconds: 246), vsync: this);

    _animation = new CurvedAnimation(
      parent: _controller,
      curve: new Interval(0.0, 1.0, curve: Curves.linear),
    );
  }

  void _move(DragUpdateDetails details) {
    final double delta = details.primaryDelta / 304;
    _controller.value -= delta;
  }

  void _settle(DragEndDetails details) {
    if(this.startFling) {
      _controller.fling(velocity: 1.0);
      this.startFling = false;
    } else if(!this.startFling){
      _controller.fling(velocity: -1.0);
      this.startFling = true;
    }
  }

  @override
  Widget build(BuildContext context) {
    final ui.Size logicalSize = MediaQuery.of(context).size;
    final double _width = logicalSize.width;
    this.flingOpening = -(48.0/_width);

    return new GestureDetector(
      onHorizontalDragUpdate: _move,
      onHorizontalDragEnd: _settle,
      child: new Stack(
        children: <Widget>[
          new Positioned.fill(
            child: new Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: <Widget>[
                new Container(
                  decoration: new BoxDecoration(
                    color: new Color(0xFFE57373),
                  ),
                  child: new IconButton(
                    icon: new Icon(Icons.delete),
                    color: new Color(0xFFFFFFFF),
                    onPressed: widget.onPressed
                  )
                ),
              ],
            ),
          ),
          new SlideTransition(
            position: new Tween<Offset>(
              begin:  Offset.zero,
              end: new Offset(this.flingOpening, 0.0),
            ).animate(_animation),
            child: new Container(
              decoration: new BoxDecoration(
                border: new Border(
                  top: new BorderSide(style: BorderStyle.solid, color: Colors.black26),
                ),
                color: new Color(0xFFFFFFFF),
              ),
              margin: new EdgeInsets.only(top: 0.0, bottom: 0.0),
              child: new Row(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  new Expanded(
                    child: new Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        new Container(
                          margin: new EdgeInsets.only(left: 16.0),
                          padding: new EdgeInsets.only(right: 40.0, top: 4.5, bottom: 4.5),
                          child: new Row(
                            children: <Widget>[
                              new Container(
                                margin: new EdgeInsets.only(right: 16.0),
                                child: new Icon(
                                  Icons.brightness_1,
                                  color: Colors.black,
                                  size: 35.0,
                                ),
                              ),
                              new Text(widget.category),
                            ],
                          )
                        )
                      ],
                    ),
                  )
                ],
              ),
            )
          ),
        ],
      )
    );
  }
}