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

Flutter中如何使用Stream实现列表项数据定期自动更新?

实现方案

核心思路:使用Flutter内置StreamBuilder组件

StreamBuilder是Flutter官方提供的专门用于监听Stream事件的组件,它会自动管理Stream的订阅与销毁,收到新的yield事件时会自动触发重绘,不需要手动调用setState更新界面。

单列表项的实现示例

你可以直接将进度展示组件封装在StreamBuilder中,绑定对应id的progress流即可:

Widget buildTaskItem(int taskId) {
  return StreamBuilder<double>(
    // 绑定对应任务id的进度流
    stream: progress(taskId),
    // 第一次拿到数据前的默认进度值
    initialData: 0.0,
    builder: (context, snapshot) {
      // 处理异常状态
      if (snapshot.hasError) {
        return const ListTile(
          title: Text('加载进度失败'),
        );
      }
      // 拿到当前最新进度
      final currentProgress = snapshot.data!;
      return ListTile(
        title: Text('任务 $taskId'),
        subtitle: LinearProgressIndicator(
          value: currentProgress,
          backgroundColor: Colors.grey[200],
          valueColor: const AlwaysStoppedAnimation<Color>(Colors.blue),
        ),
        trailing: Text('${(currentProgress * 100).toStringAsFixed(1)}%'),
      );
    },
  );
}

ListView批量构建的实现

如果有多个列表项,直接在ListView的构建逻辑中为每个任务项绑定对应的Stream即可:

ListView.builder(
  itemCount: taskList.length,
  itemBuilder: (context, index) {
    final taskId = taskList[index].id;
    return buildTaskItem(taskId);
  },
)

优化建议

  • 避免重复创建Stream:不要在StreamBuilder的stream参数中直接调用progress(id),否则组件每次重绘都会生成新的Stream,导致重复发起请求。建议在State的initState生命周期中提前初始化所有任务的Stream,存储到变量中再传给StreamBuilder:
    class _TaskListPageState extends State<TaskListPage> {
      late Map<int, Stream<double>> taskProgressStreams;
    
      @override
      void initState() {
        super.initState();
        // 一次性初始化所有任务的进度流,避免重复创建
        taskProgressStreams = {
          for (var task in taskList) task.id: progress(task.id),
        };
      }
    
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: taskList.length,
          itemBuilder: (context, index) {
            final task = taskList[index];
            return StreamBuilder<double>(
              stream: taskProgressStreams[task.id],
              initialData: 0.0,
              builder: (context, snapshot) {
                // 同上的组件构建逻辑
              },
            );
          },
        );
      }
    }
    
  • 接口请求优化:如果列表项数量较多,同时发起大量单任务进度请求会给服务器造成压力,可以将多个任务id合并为一个批量请求的Stream,一次性拉取所有任务的进度后再分发给对应组件,减少请求次数。
  • 生命周期适配:可以监听应用前后台切换事件,页面退到后台时暂停进度请求,回到前台再恢复,减少不必要的流量和性能消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:24:03