flutter - 新状态不调用 Flutter BlocBuilder
问题描述
我的集团正在产生新的状态,例如:
yield Loaded();
yield Loaded();
我的 BlocListener 检索这两个,即使它们是相同的。
另一方面,我的 BlocBuilder 没有。它只会检索第一个(或最后一个?)一个。
我没有使用 equatable ,我不明白为什么 BlocBuilder 不会被触发两次。
就我而言,我只是想再次更新 UI 而无需实际更改状态。
解决方案
构建小部件是一项昂贵的任务,Flutter 试图尽可能地降低这个成本。其中之一是在状态更改时防止重复构建。这是一个例子:
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
int a = 0;
@override
Widget build(BuildContext context) {
print(a);
return Scaffold(
floatingActionButton: FloatingActionButton(onPressed: () {
setState(() => a = 1);
setState(() => a = 1);
}),
);
}
}
此示例在第一次构建时打印 0。单击按钮后,您应该会看到 2 次打印,值为 1,但您只会在控制台中收到一条消息。为什么?因为setState
是一个async
函数,当它们被重复调用或在很短的时间内被调用时,Flutter 将它们批处理在一起,并且只触发一次。现在,如果您setState
将该代码中的最后一个更改为setState(() => a = 2)
单击按钮后,您将在控制台中获得 2。如果您反转它们(首先将 a 设置为 2,然后设置为 1),您将在控制台中获得 1。现在考虑到这一点,让我们看看它是如何BlocBuilder
工作的?
BlocBuilder
是一个StatefulWidget
并用于BlocListener
更新其状态并在需要时重建小部件。这是它的build
方法:
@override
Widget build(BuildContext context) {
return BlocListener<C, S>(
cubit: _cubit,
listenWhen: widget.buildWhen,
listener: (context, state) => setState(() => _state = state),
child: widget.build(context, _state),
);
}
正如您所看到的,我们在示例中看到的相同逻辑也适用于此,如果您在短时间内重复产生多个状态,它将使用最新状态构建一次。
推荐阅读
- memory-management - 应使用的 RAM 进程的最大百分比
- mysql - 在 asp.net 核心中不活动后注销用户
- mongodb - 错误:尝试在主机“myip:27017”上运行命令“isMaster”时出现网络错误:connect@src/mongo/shell/mongo.js:251:13
- xml - $xml.CreateElement 和空节点的表示
- wordpress - WP Job Manager - 声明列表 - 模板覆盖 - 文件夹名称
- android - 我试图在 RecyclerView 中返回我的文档,尽管其中一个字段是类型 timeStamp
- ios - NSString 类内部正在进行什么样的神奇内存管理?
- java - 如何在序列图中重定向方法
- postman - OpenDaylight RESTCONF 是否支持 HTTP PUT 或 POST 方法?
- ios - 在 iOS 上订阅 std::cout 流(stdout)