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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:00