首先,我们需要在 ListView 中添加一个删除按钮,并在点击后将该项从列表中删除。代码如下:

class MyListView extends StatefulWidget {
  @override
  _MyListViewState createState() => _MyListViewState();
}

class _MyListViewState extends State<MyListView> {
  List<String> items = ['item1', 'item2', 'item3'];

  _removeItem(index) {
    setState(() {
      items.removeAt(index);
    });
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        return Dismissible(
          key: Key(items[index]),
          onDismissed: (direction) {
            _removeItem(index);
          },
          child: ListTile(
            title: Text(items[index]),
            trailing: IconButton(
              icon: Icon(Icons.delete),
              onPressed: () {
                _removeItem(index);
              },
            ),
          ),
        );
      },
    );
  }
}

在上面的代码中,我们使用 Dismissible 组件来实现删除操作。Dismissible 是一个可滑动的组件,我们可以通过设置 onDismissed 回调函数来实现删除操作。在这个回调函数中,我们调用 _removeItem 方法来删除列表中的项。

接下来,我们可以为删除操作添加动画效果。我们可以使用 AnimatedList 组件来实现动画效果。AnimatedList 是一个已经封装好了动画效果的组件,我们只需要在删除操作时,将要删除的项从 AnimatedList 中删除即可。代码如下:

class _MyListViewState extends State<MyListView> {
  List<String> items = ['item1', 'item2', 'item3'];
  final GlobalKey<AnimatedListState> _listKey = GlobalKey<AnimatedListState>();

  _removeItem(index) {
    String removedItem = items[index];
    setState(() {
      items.removeAt(index);
      _listKey.currentState!.removeItem(
        index,
        (context, animation) => ListTile(
          title: Text(
            '${removedItem}',
            style: TextStyle(
              color: Colors.red,
              fontSize: 16,
              fontWeight: FontWeight.bold,
            ),
          ),
          trailing: Icon(Icons.delete, color: Colors.red),
        ),
        duration: Duration(milliseconds: 500),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedList(
      key: _listKey,
      initialItemCount: items.length,
      itemBuilder: (context, index, animation) {
        return SlideTransition(
          position: Tween<Offset>(
            begin: Offset(1, 0),
            end: Offset.zero,
          ).animate(animation),
          child: ListTile(
            title: Text(items[index]),
            trailing: IconButton(
              icon: Icon(Icons.delete),
              onPressed: () {
                _removeItem(index);
              },
            ),
          ),
        );
      },
    );
  }
}

在上面的代码中,我们使用一个 GlobalKey 来获取 AnimatedListState,然后在删除操作时,调用 removeItem 方法将要删除的项从 AnimatedList 中删除,并指定动画效果的持续时间。

我们还使用了 SlideTransition 组件来实现删除项的滑动效果。SlideTransition 组件接收一个 animation 参数,我们可以在这个参数上使用 Tween 来指定动画的起始和结束位置。在这里,我们将起始位置设置为 (1, 0),结束位置设置为 (0, 0),从而实现从右侧滑入的效果。

Flutter ListView 删除动画实现 - 使用 Dismissible 和 AnimatedList

原文地址: https://www.cveoy.top/t/topic/lEBn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录