ChangeNotifier调用notifyListeners后如何监听回调?
实现ChangeNotifier调用notifyListeners后的回调监听
要在每次调用notifyListeners()后执行自定义回调,核心思路是拦截notifyListeners的执行流程,在原有通知逻辑完成后触发我们的回调。下面是具体的实现方案:
自定义带回调支持的ChangeNotifier子类
通过继承ChangeNotifier并重写notifyListeners方法,我们可以轻松添加回调管理功能:
import 'package:flutter/foundation.dart'; class CallbackChangeNotifier extends ChangeNotifier { final List<VoidCallback> _postNotifyCallbacks = []; /// 添加notifyListeners执行后的回调 void addPostNotifyCallback(VoidCallback callback) { _postNotifyCallbacks.add(callback); } /// 移除指定回调 void removePostNotifyCallback(VoidCallback callback) { _postNotifyCallbacks.remove(callback); } /// 清空所有回调 void clearPostNotifyCallbacks() { _postNotifyCallbacks.clear(); } @override void notifyListeners() { // 先执行原有的通知逻辑 super.notifyListeners(); // 遍历执行所有注册的回调(用List.of避免遍历中修改列表引发异常) for (final callback in List.of(_postNotifyCallbacks)) { callback(); } } }
使用示例
1. 创建ViewModel
让你的业务逻辑类继承这个自定义的CallbackChangeNotifier:
class CounterViewModel extends CallbackChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; // 调用notifyListeners时,会自动触发后续的回调 notifyListeners(); } }
2. 在Widget中注册回调
在需要监听的地方添加回调,如果你需要类似addPostFrameCallback的帧渲染后执行逻辑,可以嵌套调用:
final viewModel = CounterViewModel(); // 注册回调 void _onNotifyComplete() { WidgetsBinding.instance.addPostFrameCallback((_) { print('notifyListeners执行完成,当前count值:${viewModel.count}'); // 这里可以处理UI更新后的逻辑,比如滚动到指定位置、显示Toast等 }); } viewModel.addPostNotifyCallback(_onNotifyComplete);
3. 避免内存泄漏
在Widget销毁时记得移除回调,防止内存泄漏:
@override void dispose() { viewModel.removePostNotifyCallback(_onNotifyComplete); // 或者一次性清空所有回调:viewModel.clearPostNotifyCallbacks(); super.dispose(); }
这个方案完全适配ChangeNotifier的使用场景,每次调用notifyListeners后都会执行你注册的回调,完美替代仅适用于setState或首次渲染的addPostFrameCallback。
内容的提问来源于stack exchange,提问作者mazen amr
相关产品推荐
相关产品推荐

