【问题标题】:Flutter Animated List Showing The List Element Twice When Animating Remove ItemFlutter 动画列表在动画删除项目时显示列表元素两次
【发布时间】:2019-10-30 07:45:17
【问题描述】:

我创建了一个列表来尝试显示我遇到的颤振问题。

每次单击列表项按钮时,它下面的按钮都会被删除。正如您从下面的 gif 中看到的,当您单击按钮时,它会创建底部元素的第二个副本。

暂停的中间动画看起来像这样:

为了创建 AnimtedList,我首先给它一个全局键:

final GlobalKey<AnimatedListState> _ListKey = GlobalKey();

然后我创建一个这样的颜色列表:

List<Color> listColors = [Colors.orange, Colors.green, Colors.red, Colors.blue, Colors.yellowAccent, Colors.brown,];

然后我有一个像这样的 AnimatedList,它具有 listColors 长度的初始大小和 _buildListItem 的子项:

AnimatedList(
    shrinkWrap: true,
    physics: NeverScrollableScrollPhysics(),
    key: _ListKey,
    initialItemCount: listColors.length,
    itemBuilder: (context, index, animation) {
                    return _buildListItem(index, animation);
    },
),

这是构建列表项方法,一个具有 List_Element 子项的 SizeTransition:

    SizeTransition _buildListItem(int index, Animation<double> animation,) {
          return SizeTransition(
            sizeFactor: animation,
            child: List_Element(index),
    );
}

这是 List_Element,列表的行带有一个简单的按钮,颜色由颜色列表的索引设置。在 onPressed 方法中,我调用 removeFromListFunction 来删除下面的行。

class List_Element extends StatefulWidget {
      int listIndex;
      List_Element(int listIndex) {
        this.listIndex = listIndex;
      }

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

    class _List_ElementState extends State<List_Element> {

      @override
      Widget build(BuildContext context) {
        return Padding(
          padding: const EdgeInsets.all(4),
          child: Container(
            width: double.infinity,
            height: 50,
            child: RaisedButton(
              color: listColors[widget.listIndex],
              elevation: 2,
              child: Center(child: Text("List item " + widget.listIndex.toString(), style: TextStyle(fontWeight: FontWeight.bold),),),
              onPressed: (){
                  _removeFromList(widget.listIndex);

              },
            ),
          ),
        );
      }
}

这是 removeFromList 函数:

void _removeFromList(int index) {
      listColors.remove(int);
      _ListKey.currentState.removeItem(index+1,
      (BuildContext context, Animation<double> animation) {
        return  _buildListItem(index, animation);
      });
    }

我不确定这是否是动画列表的问题,或者更可能是我的实现问题。

感谢您的帮助

【问题讨论】:

    标签: flutter dart flutter-layout flutter-animation


    【解决方案1】:
    void _removeFromList(int index) {
      listColors.remove(int);
      _ListKey.currentState.removeItem(index+1,
      (BuildContext context, Animation<double> animation) {
        //return  _buildListItem(index, animation);
          return  _buildListItem(index + 1, animation);
      });
    }
    

    如果我没记错的话,发生这种情况的原因是您在重建“已删除”按钮时传递了“当前单击”按钮的索引。因此它再次显示单击的按钮。

    【讨论】:

    • 感谢您的回复,不幸的是,它只是让下一行做同样的事情。
    • listColors.remove(int); 只是好奇上面的代码是故意的吗?也许你可以试试listColors.removeAt(index + 1); 另外由于颜色已经从列表中删除,_buildListItem 将无法选择正确的颜色。
    • 我的建议是将颜色本身传递给您的 List_Element 小部件或创建一个包含索引和颜色的类,以便您可以以相同的方式传递它。
    • 谢谢,但事实并非如此。这是一个简化的列表,我做了一个更复杂的列表,与您描述的相似,没有变化。
    • 太棒了,非常感谢!仍在尝试弄清楚这对于实际的网格按钮列表是如何工作的,但这将有很大帮助。感谢您的帮助!
    猜你喜欢
    • 2010-10-13
    • 2016-11-22
    • 1970-01-01
    • 2021-06-29
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2019-01-25
    相关资源
    最近更新 更多