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

时间:2019-12-18 12:46:56

标签: flutter bloc

我对状态管理的理解是,仅调用setState()会引发各种混乱的问题,代码文件变得庞大且难以调试,并且阻止了将合理的结构保存到项目中。如果窗口小部件的外观略有变化,那么拥有像BLoC或ScopedModel这样的复杂体系结构仅用于显示/隐藏窗口小部件(例如)几乎没有意义。但是,据我了解,您不能将setState()和架构混合在一起,否则架构的意义何在?

让我们对这个问题使用BLoC(仅仅是因为我碰巧正在使用它),特别是this 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()),
            ),
          ],
        );
      },
    );
  }
}

在上面的粗略示例中,将BLoC模式与setState()混合是否正确/可以接受?为什么不使用BLoC处理显示Text小部件?我在哪里划界线?优点/缺点是什么?有性能差异吗?

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

1 个答案:

答案 0 :(得分:2)

可以。

诸如scoped_model / bloc / etc之类的体系结构与删除对setState的调用无关。 它们是关于分离关注点并简化实现的方法

可以应该在合理的情况下使用setState,例如动画。

首先,即使这些体系结构也使用setState。您只是看不到它,但它在那里