首页 > 解决方案 > 如何在 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),
      );
    }
  ),
);

}

标签: flutter

解决方案


这是因为您正在重建一个已经在构建的小部件

尝试

WidgetsBinding.instance.addPostFrameCallback((_){

  _tasksEmpty.value = tasks.isEmpty;

});

推荐阅读