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
相关产品推荐
相关产品推荐

