FLutter:onHorizontalDragUpdate 在可关闭小部件中未触发

问题描述 投票:0回答:1

我创建了一个像这样的可关闭小部件:

 GestureDetector(
      onHorizontalDragUpdate: (DragUpdateDetails event) {
        setState(() {
          _offsetX = event.globalPosition.dx;
          print("Event : ${event.globalPosition.dx}");
        });
      },
      onHorizontalDragStart: (DragStartDetails event) {
        setState(() {
          _offsetX = event.globalPosition.dx;
          print("Event : ${event.globalPosition.dx}");
        });

        print(_offsetX.abs());
        // }
      },
      child: Dismissible(
        key: UniqueKey(),
        direction: DismissDirection.endToStart,
        onResize: () {},
        onUpdate: (details) {
          // });
        },
        onDismissed: (direction) {},
        secondaryBackground: AnimatedContainer(
            duration: const Duration(milliseconds: 300),
            transform: Matrix4.translationValues(_offsetX - 36, 0.0, 0.0),
            color: Colors.red,
            padding: const EdgeInsets.only(left: 20),
            child: const Row(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                Icon(
                  Icons.delete,
                  color: Colors.white,
                  size: 36,
                ),
                // Add other widgets here that you want to move with the swipe
              ],
            )),
        background: Container(
          color: DsColors.secondary,
        ),
        confirmDismiss: (direction) async {
          final result = await Future.delayed(const Duration(seconds: 6), () {
            return false;
          });
          return result;
        },
        child: widget.child,
      ),
    )

我想当孩子被交换时,删除 secondaryBackground 里面的图标,像交换孩子一样从右到左移动,但是当我交换孩子时 onHorizontalDragUpdate 不会被触发?

flutter animation dismissible
1个回答
0
投票

您可以从

onHorizontalDragUpdate
GestureDetector
回调中获取类似的拖动更新信息,而不是使用
onUpdate
中的
Dismissible

Dismissible(
  onUpdate: (details) {
    final progress = details.progress;
    // ...
  }
)

您还需要传递一个在构建调用之间持续存在但对该项目唯一的密钥。您应该使用具有常量值或附加项目标识符的

UniqueKey()
,而不是使用及时构建的
ValueKey
。例如,如果小部件位于
ListView
构建器内,则需要将
index
包含在
ValueKey
的值中:

Dismissible(
  key: ValueKey('myItem-$index'),
  // ...
)
© www.soinside.com 2019 - 2024. All rights reserved.