You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何判断DraggableScrollableController是否正在动画?

解决DraggableScrollableSheet动画状态判断问题

原生的DraggableScrollableController确实没有内置的isAnimating属性,但可以通过以下两种方式实现需求:

方法一:自定义扩展控制器,统一维护动画状态

创建一个包装原生控制器的自定义类,自行管理动画状态,适合多场景触发动画的情况:

class CustomDraggableController extends DraggableScrollableController {
  bool _isAnimating = false;
  bool get isAnimating => _isAnimating;

  @override
  Future<void> animateTo(
    double position, {
    required Duration duration,
    required Curve curve,
  }) async {
    _isAnimating = true;
    notifyListeners(); // 通知监听者状态变更
    try {
      await super.animateTo(position, duration: duration, curve: curve);
    } finally {
      _isAnimating = false;
      notifyListeners();
    }
  }
}

使用时直接替换原生控制器,外部Widget可以通过controller.isAnimating获取状态,也可以添加监听同步UI:

@override
void initState() {
  super.initState();
  _customController.addListener(() {
    setState(() {}); // 状态变化时更新UI
  });
}

方法二:利用animateTo返回的Future手动维护状态

如果动画触发逻辑单一,也可以在调用动画时手动管理布尔状态:

bool _sheetIsAnimating = false;

void triggerSheetAnimation() async {
  _sheetIsAnimating = true;
  setState(() {});
  try {
    await _controller.animateTo(
      0.8,
      duration: const Duration(milliseconds: 300),
      curve: Curves.easeInOut,
    );
  } finally {
    _sheetIsAnimating = false;
    setState(() {});
  }
}

外部Widget直接通过_sheetIsAnimating变量即可判断当前是否处于动画状态。

注意点

  • 若使用StatefulWidget,状态变更时需调用setState;如果是跨Widget共享状态,建议配合Provider、Riverpod等状态管理工具同步。
  • 自定义控制器的方式更适合复杂场景,能避免多处维护状态导致的不一致问题。

内容的提问来源于stack exchange,提问作者user1087973

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:15:43