Flutter:我可以在 BLoC 架构中使用 setState() 吗?

Tom*_*Tom 6 flutter bloc

我对状态管理的理解是,setState()单独调用会带来各种混乱的问题,代码文件变得庞大且难以调试,并且它阻止了项目的合理结构。在小部件的外观略有变化的情况下,拥有像 BLoC 或 ScopedModel 这样的复杂架构只是为了显示/隐藏小部件(例如)是没有意义的。然而,我所理解的方式是你不能将setState()一个架构混合在一起,否则架构的意义何在?

让我们对这个问题使用 BLoC(只是因为我碰巧在使用它),特别是这个 package。假设我有这个超级简单的示例代码:

class MyWidget extends StatefulWidget {
  @override
  void createState() {
    return _MyWidgetState();
  }
}

class _MyWidgetState extends State<MyWidget>() {
  bool _isShowing = false;
  MyBloc bloc;

  @override
  void initState() {
    super.init();
    bloc = MyBloc();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder(
      bloc: bloc,
      builder: (context, state) {
        return Column(
          children: <Widget>[
            Text(state.myText),
            if (_isShowing)
              Text("Button has been pressed!"),
            RaisedButton(
              child: Text("Show label"),
              onTap: () => setState(() => _isShowing = true),
            ),
            RaisedButton(
              child: Text("Run event"),
              onTap: () => bloc.add(NewEvent()),
            ),
          ],
        );
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的粗略示例中,将 BLoC 模式与setState()? 为什么我不使用 BLoC 来处理显示Text小部件?我在哪里划线?有什么优点/缺点?有性能差异吗?

注意:我不是在寻找“只是将两个Text小部件合并在一起”的答案。我正在寻找纯粹的建筑观点。

Rém*_*let 19

你可以。

像 scoped_model/bloc/etc 这样的架构并不是要删除对 setState 的调用。它们是关于分离关注点和简化实现

可以而且应该在需要使用 setState 时使用它,例如动画。

首先,即使是这些架构也使用 setState。你只是没有看到它,但它就在那里