为何无BlocBuilder与StatefulWidget,Flutter Cubit仍能更新界面?
出现这种情况通常有以下几种原因:
父组件已监听Cubit状态并触发重建
你的StatelessWidget可能嵌套在某个使用了BlocBuilder、BlocListener或者context.select()的父组件中。当Cubit的状态变更时,父组件会先重建,作为子组件的StatelessWidget也会随之重新build,从而实现界面更新。BlocProvider本身基于InheritedWidget,父组件的状态监听会带动子组件的更新。StatelessWidget的build方法中使用了
context.watch<Cubit类型>()
即使是StatelessWidget,只要在build方法里调用了context.watch()来订阅Cubit的状态,Flutter的依赖系统就会感知到状态变化,自动标记这个StatelessWidget需要重建。这和StatefulWidget里调用setState()的效果类似,只是依赖管理由Bloc/Provider框架处理。Cubit的方法直接触发了其他界面更新机制
你调用的setTab方法可能没有直接依赖Cubit的状态来更新界面,而是内部操作了比如PageController、Navigator或者其他全局状态对象。这种情况下,界面更新是由这些对象的状态变化触发的,Cubit只是作为触发这些操作的入口,自然不需要BlocBuilder来监听。
简单来说,BlocBuilder不是监听Cubit状态并更新界面的唯一方式,只要组件能感知到Cubit的状态变化(通过父组件传递、自身订阅),或者状态变更触发了其他更新逻辑,StatelessWidget一样能实现界面更新。
内容的提问来源于stack exchange,提问作者w461

