Flutter中appStateManager.addListener(notifyListeners)的含义是什么?
原理说明
首先纠正你的认知偏差:ChangeNotifier的addListener方法要求传入的参数本身就是无参数无返回值的VoidCallback函数,不存在所谓的特殊「Listener对象」,你的原有理解有误。
这段代码的运行逻辑如下:
- 你的
AppRouter通过with ChangeNotifier混入了ChangeNotifier的能力,因此本身就自带notifyListeners实例方法,这个方法的签名完全符合VoidCallback的要求,所以可以直接作为参数传入addListener。 - 代码中的
appStateManager、groceryManager、profileManager三个实例均为ChangeNotifier的子类,各自负责对应模块的状态管理。当它们内部的状态发生变更时,会主动调用自身的notifyListeners方法,执行所有已注册的回调函数。 - 构造函数中给三个管理器注册的回调是
AppRouter自己的notifyListeners,本质是做了一层事件转发:只要任意一个管理器的状态发生变化,就自动触发AppRouter的状态变更通知。 - 而
AppRouter继承自RouterDelegate,Flutter的路由系统本身就会监听RouterDelegate的状态变更,一旦收到notifyListeners的通知,就会重新调用RouterDelegate的build方法生成最新的页面栈,完成路由跳转、页面更新的逻辑。
你当前的写法和下面写匿名回调的效果完全一致,Dart支持直接将符合签名的实例方法作为参数传递,是语言层面「函数是一等公民」的特性体现,简化了代码:
appStateManager.addListener(() { notifyListeners(); });
内容的提问来源于stack exchange,提问作者Priyshrm
相关产品推荐
相关产品推荐

