BlocListener只返回初始加载状态
创始人
2024-12-22 21:30:24
0次

要确保 BlocBuilder 或 BlocProvider 的状态是在 BlocListener 中更新的,否则 BlocListener 将始终接收到初始加载状态。解决方法是在需要更新状态的 BlocBuilder 或 BlocProvider 中使用一个新变量来存储当前状态,并在需要更新状态时使用一个新的方法来更新该变量。

例如,假设我们有一个 CounterBloc,它会根据用户操作更新状态。我们可以使用以下代码来解决该问题:

class CounterBloc extends Bloc {
  CounterBloc() : super(0);

  @override
  Stream mapEventToState(CounterEvent event) async* {
    if (event == CounterEvent.increment) {
      yield state + 1;
    } else if (event == CounterEvent.decrement) {
      yield state - 1;
    }
  }
}

class CounterWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => CounterBloc(),
      child: BlocBuilder(
        builder: (context, state) {
          return Text('$state');
        },
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter'),
      ),
      body: BlocListener(
        listener: (context, state) {
          print('Counter state changed to $state');
        },
        child: CounterWidget(),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () =>
                context.read().add(CounterEvent.increment),
            child: Icon(Icons.add),
          ),
          SizedBox(height: 8),
          FloatingActionButton(
            onPressed: () =>
                context.read().add(CounterEvent.decrement),
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

在这个例子中,我们使用 BlocProvider 和 BlocBuilder 来创建并显示计数器的当前值。在 CounterPage 中使用 BlocListener 来监听计数器的状态变化。

要确保 BlocListener 正确更新状态,我们必须在 CounterBloc 中使用 yield 来更新状态,并在 BlocBuilder 中使用一个新的变量来存储当前值。然后在 BlocListener 中监听该变量的变化,而不是 CounterBloc 直接返回的值。

使用这种方法,我们

相关内容

热门资讯

黑科技辅助!个人棋牌(辅助),... 黑科技辅助!个人棋牌(辅助),乐得互娱切实真的有透视挂工具(有辅助挂技巧)个人棋牌辅助器是一种具有地...
黑科技外挂!福州十八扑(外挂)... 黑科技外挂!福州十八扑(外挂),心悦龙江麻将真是是真的有透视挂技巧(有辅助挂实锤)心悦龙江麻将辅助器...
黑科技作弊器!欢乐达人(作弊器... 黑科技作弊器!欢乐达人(作弊器),天天象棋确实是有透视挂技巧(有辅助挂工具)欢乐达人透视方法中分为三...
黑科技透视器!天狐游戏(透视器... 黑科技透视器!天狐游戏(透视器),微乐家乡麻将切实是真的有透视挂攻略(有辅助挂教学)1、上手简单,内...
黑科技作弊器!决胜麻将胡易(作... 黑科技作弊器!决胜麻将胡易(作弊器),江山大厅确实存在有透视挂脚本(有辅助挂解惑)1、许多玩家不知道...
黑科技透视挂!全民牛牛(透视挂... 黑科技透视挂!全民牛牛(透视挂),悠乐竞技其实有透视挂工具(有辅助挂解密)1)悠乐竞技有没有挂:进一...
黑科技开挂!星际互联(开挂),... 黑科技开挂!星际互联(开挂),葫芦娃三宝果然是有透视挂教程(有辅助挂方式)暗藏猫腻,小编详细说明葫芦...
黑科技外挂!开云(外挂),天天... 黑科技外挂!开云(外挂),天天象棋总是真的有透视挂插件(有辅助挂解密)1、任何天天象棋透视是真的假的...
黑科技辅助器!山西麻将(辅助器... 黑科技辅助器!山西麻将(辅助器),三哥玩一直是真的有透视挂方法(有辅助挂讲解)1、玩家可以在山西麻将...
黑科技开挂!娱家麻将(开挂),... 黑科技开挂!娱家麻将(开挂),牛旋风好像存在有透视挂app(有辅助挂辅教程)亲,关键说明,娱家麻将透...