flutter - 如何在 Flutter 中使用 ValueListenableBuilder 中的 ValueNotifier?
问题描述
我正在使用 CustomScrollView,我需要在 3 SliverList 和 2 SliverGrid 中搜索数据。他们都用 ValueListenableBuilder 监听他们的数据,而且我有一个信息框,显示是否找到任何数据。有 5 个ValueNotifier<bool>
变量可以帮助我显示/隐藏信息框,但问题是当构建器再次调用时,我需要ValueNotifier.value
在此构建器内部调用,但它给出了错误:
setState() or markNeedsBuild() called during build.
我知道为什么会发生这个错误,但我找不到任何其他解决方案,因为我需要跟踪列表和网格的状态(其中一些项目可以删除,同时我需要再次检查新列表或网格有数据)
SliverList 之一:
Widget _taskWidgets() {
return SliverPadding(
padding: const EdgeInsets.fromLTRB(16, 22, 16, 16),
sliver: ValueListenableBuilder(
valueListenable: _taskService.listenable,
builder: (_, __, child) {
var tasks = _taskService.search(_keyword.value);
_tasksEmpty.value = tasks.isEmpty; // this line gives error
if (!_showCompleted.value) {
tasks = tasks.where((e) => !e.completed).toList();
}
final listIDS = tasks.map((e) => e.listID).toSet();
return SliverList(
delegate: SliverChildBuilderDelegate((_, index) {
if (index % 2 == 0) {
final widget = HierarchyCard(tasks, index ~/ 2, true);
if (index == 0) {
return Stack(
clipBehavior: Clip.none,
children: [
widget,
_text(_appLocalizations.searchTasks),
],
);
}
return widget;
}
return const SizedBox(height: 30);
}, childCount: 2 * listIDS.length - 1),
);
}
),
);
}
解决方案
这是因为您正在重建一个已经在构建的小部件
尝试
WidgetsBinding.instance.addPostFrameCallback((_){
_tasksEmpty.value = tasks.isEmpty;
});
推荐阅读
- apache - 带有 Plesk 的 Django 部署问题“没有配置名为 '<>' 的 WSGI 守护进程”
- java - 删除给定节点之前的节点
- javascript - 空数组的串联如何防止排序突变?
- javascript - XMLHttpRequest 调用不返回任何内容
- android - 使用 json 在两个微调器中填充省和市
- c - 这里发生了什么,Buffer-Overflow 跳过了几个字节
- node.js - 如何使用 Google Calendar API 和 NodeJS 列出用户的可用日历
- java - 在 JSONArray 中获取长度未知的 JSONArray
- html - FontAwesome 5 - 多色图标
- azure - Azure EdgeHub 是否加密 MessageStore 中的消息?