You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监听ObservableList?代码无输出的问题排查

用ObservableList监听单个值变化的正确实现

问题说明

尝试使用ObservableList监听单个元素的变化,但运行代码后无输出,预期打印修改后的元素值second valuee。

初始代码

pubspec.yaml:

name: observable_demo

dependencies:
  observable: ^0.24.0

Dart脚本:

import 'package:observable/observable.dart';

void main() {
  var obs = ObservableList.from(["first value"]);
  obs.changes.listen(([value = ""]) {
    print(value);
  });
  obs[0] = "second valuee";
}

问题原因

obs.changes是Stream<List<ChangeRecord>>,而非直接发出元素值。它会发送包含列表变更详情的ChangeRecord对象集合,而不是修改后的元素本身。你的代码错误地将流的参数当作元素值处理,自然无法得到预期输出。

正确实现

要获取修改后的元素值,需要解析changes流中的ListChangeRecord,判断变更类型并提取新值:

import 'package:observable/observable.dart';

void main() {
  var obs = ObservableList.from(["first value"]);
  
  obs.changes.listen((List<ChangeRecord> records) {
    for (final record in records) {
      if (record is ListChangeRecord && record.type == ListChangeType.set) {
        print(record.newValue);
      }
    }
  });
  
  obs[0] = "second valuee";
}

代码说明

  • changes流每次触发时会传递一组ChangeRecord,遍历这些记录筛选出列表元素替换的变更
  • ListChangeType.set对应元素被替换的场景,通过record.newValue可以获取修改后的元素值
  • 无需额外依赖,list_diff包已被observable间接引入,可直接使用相关类型

运行dart run demo.dart后,会输出预期的:

second valuee

内容的提问来源于stack exchange,提问作者Hydroper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:27:14