首页 > 解决方案 > 如何在状态更改时更新 BlocBuilder 之外的 SliverAppBar 小部件?

问题描述

我正在尝试更新SliverAppBar小部件关于BlocState更改的数据。由于 SliverAppBar 不是 BlocBuilder 的一部分,因此它不会在状态更改时更新。从块中调用 setState() 会导致以下错误。

这个 HomePage 小部件不能被标记为需要构建,因为框架已经在构建小部件的过程中。仅当其祖先之一当前正在构建时,小部件才能在构建阶段标记为需要构建。这个例外是允许的,因为框架在子组件之前构建父窗口小部件,这意味着将始终构建脏后代。否则,框架可能不会在此构建阶段访问此小部件。RenderViewport 需要 RenderSliv​​er 类型的子级,但接收到 RenderErrorBox 类型的子级。

这是我的代码...

class HomePageState extends State<HomePage> {
int items = 121;

@override
Widget build(BuildContext context) {
 return Material(
  child: Scaffold(
    backgroundColor: Colors.white,
    body: CustomScrollView(
      slivers: [setAppBar(), setContent()],
    ),
  ),
 );
}

 setAppBar() {
    return SliverAppBar(
    automaticallyImplyLeading: false,
    floating: true,
    elevation: 1.0,
    forceElevated: true,
    centerTitle: false,
    backgroundColor: Colors.white,
    title: Text("$items"));
   }

 setContent(){
     return BlocBuilder<MyBloc, MyState>(
     builder: (context, state) {
    if (state is DataLoadedState) {
      return SliverFillViewport(
      delegate:
            SliverChildBuilderDelegate((BuildContext context, int index) {
          items = state.items;
          ///  
          /// **Want to update my items in the SliverAppBar from here ...** 
          ///
          return MyWidget();
        }, childCount: 1),
      );
    }
 } 

如何将我的更改发布到 BlockBuilder 范围之外的小部件?

标签: flutterdartbloc

解决方案


我想到了。解决方案是使用BlocConsumer代替BlocBuilder。我在BlocConsumer中实现了BlocListenerBlocBuilder

 setContent(){
    return BlocConsumer<HealthHomeBloc, HealthHomeState>(
      buildWhen: (previous, current) {
    return !(current is ItemUpdateState);
  }, builder: (context, state) {
     return ReuiredWidgetBasedOnState();
    
    }, listener: (context, state) {
      if(state is ItemUpdateState)
        setState(){
            items = state.items;
        }
   }, listenWhen: (previous, current) {
       return current is ItemUpdateState;
  });
}

所以当我们以这种方式调用 setState 时,它​​不会干扰构建器的状态。BlocListener 可以将我们需要的状态发布到 BlocBuilder 之外的小部件


推荐阅读