【问题标题】:Flutter : Update all items in a ListViewFlutter:更新 ListView 中的所有项目
【发布时间】:2021-03-18 10:36:55
【问题描述】:

我正在尝试创建一个更简单的上下文操作栏(CAB)https://pub.dev/packages/contextualactionbar

我想做的是在 Flutter 中更新 ListView 中的所有项目。 例如,当我长按某个项目时,我想为每个 ListTile 显示一个尾随复选框。该项目可以是有状态的小部件。

这是我想做的事情的 gif:

我尝试使用来自https://stackoverflow.com/a/57310380/5712419 的 GlobalKey 示例

使用 GlobalKey,只有可见项目会更新。

2021 年 4 月 28 日更新:我用对我有用的东西回答了这个问题:Provider 包。我认为它比使用 GlobalKey 更干净。

【问题讨论】:

  • 您不应该通过全局键引用您的列表项。您的状态对象应该在您的 statefull 小部件中 - 构建列表的那个。列表元素应该引用您的状态对象。然后,您的 onLongPressCode 将操纵您的状态对象(列表或您决定这样做),而 ListView 将使用该状态重建。
  • 如果我理解正确我必须从 ListObjectWidget 中获取状态对象 ListObjectWidgetState。我怎样才能做到这一点? pastebin.com/D79UYh6e
  • 我目前面临的一个问题是,每次我向下滚动列表时,所选项目都会重置为未选择。 (我认为 Flutter 在滚动时会重建这些项目)
  • 我还有一个问题:如何显示列表视图中的项目数。我真的很想拥有类似_ListViewObjects(list).getWidgets()
  • 看来您的操作方式错误。例如 - 要显示项目计数,看起来您正在尝试引用 UI 组件,然后计算它生成的小部件的数量。这不是应该这样做的:Flutter 是“反应式”框架,您应该始终仅根据数据绘制界面;不基于其他组件。因此,如果您想显示列表中的项目数,只需使用: Text("Item count is ${ListObjects.length}");这将在包含您的 ListObjects 的 Widget 的构建方法中运行。不要从其他 UI 组件中派生它。

标签: flutter


【解决方案1】:

可以使用 Provider 选择 ListView 中的所有项目。 https://pub.dev/packages/provider

这些是我采取的步骤。

第 1 步:为单个项目创建一个扩展 ChangeNotifier 的类

class SelectableItemState extends ChangeNotifier {
    
  bool _selectable = false;

  bool get selectable => _selectable;

  set selectable(bool value) {
    _selectable = value;
    notifyListeners();
  }
}

第 2 步:注册更改通知器

return MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (context) => SelectableItemState()),
  ], //...

第 3 步:创建消费者,并通过手势检测器更新状态

 return Consumer<SelectableItemState>(builder: (context, state, child) {
      return GestureDetector(){
           onLongPress: () {
             state.selectable = true;
           },
           child: Material( // use state.selectable in the item widget...

      }
 
 }

第 4 步:更新项目的尾随(如果可选择,则显示复选框,否则,显示空容器)

trailing: (state.selectable)
    ? Checkbox(
        value: // state.selectedItem,
        onChanged: (value) {
          setState(() {
            // Here we can use something like
            // state.setSelectedItem(item, value);
          });
        },
      )
    : Container(),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2020-05-14
    • 2021-08-25
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多