dart 使用setState和bloc进行状态管理

ktca8awb  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(125)

使用bloc和setState进行状态管理好吗?基本上,当我需要在其他类(屏幕)共享状态时,我使用bloc来控制状态,但我在可重用组件(如文本字段)中使用setState,在那里我控制错误消息,模糊文本等。我认为这也不一定要在业务逻辑中。所以我想知道这是不是一个好的做法。
Thanks!

zf9nrax1

zf9nrax11#

在有状态小部件中使用setState没有问题,即使您使用的是BLoC。不幸的是,我没有使用BLoC,但是如果你可以在BLoC中管理错误消息,那就更好了,因为你可以只使用BLoC,而可以使用无状态的小部件,这将比有状态的小部件更不频繁地重建。
在我看来,在同一个小部件中使用setState和BLoC没有什么大的危害。

btxsgosb

btxsgosb2#

建议不要在BlocListener中使用setState(如果可能),因为BlocListener本身就是用来控制状态的(它可以提高UI的可读性和一致性)。相反,尝试在需要重建的零件上使用BlocBuilder。这可能会限制您在UI方面实现您想要的功能,但如果操作正确,它也可以优化您的应用程序。例如,只在需要UI更新的小部件上使用BlocBuilder(针对特定的小部件)

BlocBuilder<Bloc, BlocState>(
builder:(context, state){
  bool isLoading = state is LoadingBloc;
  return ElevatedButton(
     onPressed: ()=>BlocProvider.of<Bloc>(context).add(BlocEvent),
     style: ElevatedButton.styleFrom(size: Size.fromRadius(20),),
     child: isLoading?CircularProgressIndicator():Text('Load data'),
    );
}

这是一个使用BlocBuilder显示简单加载用户反馈的简单场景。然而,这种实现可能会限制您实现需要全局状态标志的复杂UI,在这种情况下,我很少在BlocListener中使用setState。
注意-你可以用与上面例子相同的方式实现你的文本域

相关问题