Flutter:如何更新单个列表项的 ValueNotifier

2024-01-15

我有一个列表生成器,用于创建包含内容的卡片。在这张卡中,我有一个按钮和文本小部件。基本上,我想在按下按钮时更新文本小部件。我尝试使用 ValueNotifier 并且它有效。但它会更新每个列表项的值。

这是主要功能:

我创建了 ValueNotifier 变量

class SelectedOrganizationStructure extends StatefulWidget {
  static ValueNotifier<String> lastLoginDate = ValueNotifier('Last login');
  final List<OrganizationUnitEntity> organizationStructure;
  const SelectedOrganizationStructure(this.organizationStructure, {Key? key})
      : super(key: key);

  @override
  State<SelectedOrganizationStructure> createState() =>
      _SelectedOrganizationStructureState();
}

我将其设置为文本小部件Text(SelectedOrganizationStructure.lastLoginDate.value),当我按下按钮时,我将其值设置为当前日期,如下所示:

final _dateTime = DateTime.now();
final _loginDate = DateFormat('dd.MM HH:mm').format(_dateTime).toString();

onTap: () {
  SelectedOrganizationStructure.lastLoginDate.value = _loginDate
},

我之前说过,这会设置列表生成器中所有卡片项目的当前日期。我怎样才能让它只更新按下女巫按钮的卡片?


问题

ValueNotifier仅当值更改时通知其侦听器。但是,如果该值为List像这样:

final myListNotifier = ValueNotifier<List<String>>([]);

像这样更改单个项目:

myListNotifier.value.add('Hello');

不会通知侦听器,因为列表本身没有更改。仅列表中的一项发生了变化。对于 Dart 来说,列表是对列表对象的引用。每次更改列表内容时,该引用都不会更改。

有几种解决方案。

创建新列表

如果您使用更新的内容创建新列表,则更改value通知程序中将导致它通知其侦听器。下面演示了这一点:

final newList = myListNotifier.value.toList();
newList.add('Hello');
myListNotifier.value = newList;

这很有效,而且对于大多数情况来说可能没问题。毕竟,在大多数应用程序中,您不会处理非常长的列表,因此制作副本并不是什么大问题。

然而,还有另一种选择。

自己通知听众

Since ValueNotifier延伸ChangeNotifier你可以打电话notifyListeners你自己。然而,这种方法有一个protected注释,这意味着您只能从子类中调用它。

以下是创建自定义子类的示例:

class MyStateManager {
  final myListNotifier = ListNotifier();

  void send(String text) {
    myListNotifier.add(text);
  }
}

class ListNotifier extends ValueNotifier<List<String>> {
  ListNotifier() : super([]);

  void add(String listItem) {
    value.add(listItem);
    notifyListeners();            // here
  }
}

In your add方法中,您更新列表的内容(无需创建新列表),然后手动通知侦听器,就像在ChangeNotifier.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:如何更新单个列表项的 ValueNotifier 的相关文章

随机推荐

  • 关于 Android API 中的新方法和已弃用的方法

    我是安卓开发新手 我正在学习过时的书籍 所以我对新方法感到非常困惑 我将制作一个简单而轻便的应用程序 即使在旧设备上也可以运行 因此 当我创建一个新的android项目时 我将 Minimum required SDK 设置为API 8 T
  • 返回导出模块的最佳方法

    在我的学习之旅中 我开始研究 javaScript Node 的模块 让我困惑的是 当模块内完成功能的时间未知时 如何从模块返回信息 这将按预期返回 控制器 js const myModule require myModule var my
  • React中如何通过Key查找元素?

    ul li 1234 li li 5678 li li 9 li ul 如何通过Key查找元素并更改元素值 如addClass innerHtml 注意 在 Plain React 中 没有 Flux 或 Jsx 进入key已在 React
  • 为什么 groupby 和rolling 不能一起工作?

    我有一个从 coinmarketcap 中抓取的 df 我正在尝试计算 close price 列的波动率指标 但是当我使用 groupby 时 我收到一条错误消息 final coin data vol final coin data g
  • Doctrine2:[语义错误]如果不选择至少一个根实体别名,则无法通过标识变量选择实体

    这是我使用查询生成器进行的查询 它运行得很好 带来了用户表和模块表的所有结果 其中具有多对多关联 public function getUser id qb this gt getEm gt createQueryBuilder gt se
  • 具有引用完整性的 NoSQL/RDBMS 混合(删除级联)?

    是否有一种数据库可以为您带来引用完整性的优势并能够使用 SQL 类型语言进行查询 同时还可以松散地定义实体的数据属性以及它们之间的关系 例如 采用 RBAC 类型模型 其中有权限 用户 用户组和角色 复杂 灵活的模型可能具有以下规则 角色可
  • Python:如何创建一个要求准确字数的函数?

    这是我到目前为止所拥有的 import string 所以我让用户写一个 5 个单词的句子 只要求 5 个单词 def main sentence raw input Enter a 5 worded sentence if len wor
  • IIS 7.5 没有图像 css js 显示

    我有 2 台 Windows 2008 R2 x64 服务器 NLB ARR 具有共享配置 我的应用程序文件位于网络共享中 ASP net 页面 aspx 运行良好 但 css 图像 js 不起作用 我还有一个 htm 文件 可以很好地显示
  • 反编译Obj C框架

    我想反编译iOS Twitter 框架 如果事实上我从xcode 的模拟器中获取twitterd 文件 该文件已预编译为在x86 而不是ARM 上运行 至于我使用的工具http code google com p i386codedump
  • 需要快速读取 Android 传感器

    Issue 我正在开发一个应用程序 每 5 需要一个新的加速度数据 毫秒 我的方法 我创建了一个远程服务 只读取加速度 来自 SensorManager 的数据 我还将读取速率设置为 初始化时 延迟最快 传感器管理器 然后我也使用IPC进行
  • 如何在 Windows 7 64 位上安装 GitHub 时修复此错误

    http picsmashup com images jnasdh JPG http picsmashup com images jnasdh JPG 组件 Microsoft NET Framework 4 x86 和 x64 安装失败
  • Wix Burn 捆绑包 - 必须是管理员

    我创建了一个 WIX 刻录包 在捆绑包中 我安装了 Net 4 如果未安装 然后再安装 2 个 msi 文件 1 是第三部分 msi 另一个是我使用 WIX 为我的软件创建的 msi 我需要成为计算机上的管理员才能运行这些 msi 文件 如
  • OpenCV 中组合仿射变换的内置函数?

    Opencv中有没有结合仿射变换的内置函数 我也可以自己编写它 但如果可能的话我会坚持使用库函数 Cheers 现在我这样做 我分配 a1 a2 r 矩阵 所有 3x3 眼睛 我用变换矩阵 a1aff a2aff 替换前两个矩阵的顶部部分
  • parseInt 与 unary plus,何时使用哪个?

    这条线有什么区别 var a parseInt 1 10 a 1 和这条线 var a 1 a 1 This jsperf测试 http jsperf com parseint vs unary operator表明一元运算符在当前的 ch
  • 追加到Python字典中的列表[重复]

    这个问题在这里已经有答案了 有没有更优雅的方式来编写这段代码 我在做什么 我有钥匙和日期 可以有多个日期分配给一个键 因此我正在创建一个日期列表字典来表示它 下面的代码工作正常 但我希望有一个更优雅和 Pythonic 的方法 dates
  • 如何使用 setLocalNightMode() 在每个活动中启用 MODE_NIGHT_YES?

    我最近想创建一个设置 在我的 Android 应用程序中启用夜间模式 我在互联网上搜索并找到了一个很好的解决方案 其中包含 AppCompatDelegate 的 DayNight 主题和一个简短的代码片段 if settingsShare
  • 如何在 C++ 中使用 cin 隐藏用户输入? [复制]

    这个问题在这里已经有答案了 可能的重复 从 std cin 读取密码 https stackoverflow com questions 1413445 read a password from stdcin 我正在尝试制作一个简单的密码程
  • 在 Azure AD B2C 中,ACR 或 TFP 声明是否应该具有策略名称?

    根据这个文档 https learn microsoft com en us azure active directory b2c active directory b2c reference tokens the Policy Name应
  • FluentNHibernate - 自动映射忽略属性

    我有一个基类 其中包含一个名为 IsDirty 的属性 它用于域模型 不是数据库表中的列 当使用自动映射时 Fluent nhibernate 尝试将此列添加到表中 解决这个问题的一种方法是把 ForTypesThatDeriveFrom
  • Flutter:如何更新单个列表项的 ValueNotifier

    我有一个列表生成器 用于创建包含内容的卡片 在这张卡中 我有一个按钮和文本小部件 基本上 我想在按下按钮时更新文本小部件 我尝试使用 ValueNotifier 并且它有效 但它会更新每个列表项的值 这是主要功能 我创建了 ValueNot