【问题标题】:Flutter [animations] OpenContainer how to detect the animation is finishedFlutter [animations] OpenContainer如何检测动画是否完成
【发布时间】:2026-02-18 04:35:01
【问题描述】:

我正在使用OpenContainer animation 打开一个屏幕,该屏幕可以在打开屏幕时显示警报对话框 - 屏幕尝试显示的项目的情况不再有效或被删除。

因为OpenContainer在动画过程中渲染屏幕,所以警告对话框显示了好几次。

我的尝试来解决这个问题是修改 OpenContainer buildPage 方法以将动画状态返回到 openBuilder 回调。不修改OpenContainer代码有没有更好的办法?

child: AnimatedBuilder(
        animation: animation,
        builder: (BuildContext context, Widget child) {
          if (animation.isCompleted) {
            return SizedBox.expand(
              child: Material(
                color: openColor,
                elevation: openElevation,
                shape: openShape,
                child: Builder(
                  key: _openBuilderKey,
                  builder: (BuildContext context) {
                    return openBuilder(context, closeContainer, false); // added false
                  },
                ),
              ),
            );
          }

重现问题的代码 - https://gist.github.com/MartinJLee/0992a986ad641ef5b4f477fb1ce69249

【问题讨论】:

  • 考虑改用AlertDialog
  • @dev-aentgs 我正在使用 AlertDialog
  • 对不起,我的意思是如果OpenContainer 只显示AlertDialog 的新屏幕,那么直接使用AlertDialog,因为它默认隐藏原始屏幕。你能添加你想要达到的效果的图像吗?
  • 是的,我不只是显示AlertDialog,该对话框将显示在可能被发布者删除的原始内容的顶部。截图是OpenContainer动画后会显示的内容。
  • 我想我应该使用类似*.com/questions/49466556/…

标签: flutter flutter-animation


【解决方案1】:

你可以像这样向你的 AnimationController 添加一个监听器

假设你有一个像这样的 AnimationController -

AnimationController _animationController =  AnimationController(
            vsync: this, 
            duration: Duration(seconds: 5),
      );

然后你可以使用 addStatusListener 方法向这个_animationController 添加一个状态监听器,像这样 -

_animationController.addStatusListener((status) {
        if(status == AnimationStatus.completed){
          //Do something here
        }
    });

每次动画状态改变时都会调用这个监听器。

希望这会有所帮助!

【讨论】:

  • 据我所知,我们无法将AnimationController 添加到OpenContainer
  • AnimationBuilder 的动画参数采用 AnimationController 的实例。
  • 对不起,我更新了我的问题,我想问是否有更好的方法来解决这个问题而无需修改OpenContainer 代码
【解决方案2】:

我能够在 openBuilder 的容器上使用以下代码。

  void initState() {
    super.initState();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));
  }

查看原始答案 - Flutter: Run method on Widget build complete

【讨论】: