如何避免Flutter StreamBuilder跳过数据?

txu3uszq  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(120)

看起来好像flutter StreamBuilder在执行builder方法之前发生多个数据事件时会忽略数据。
我尝试了下面的代码,我希望显示“1; 2;3;4;5;6;”等。按下按钮3次后。(不是应该在每次调用code.add()时调用一次构建器方法吗?)
但是,只有每隔一个code.add()调用才到达生成器方法,从而导致输出“2; 4;6;"。
我是否误解了StreamBuilder的行为?或者我如何修复代码,以便可以“同时”发送多个数据?

import 'dart:async';
import 'package:flutter/material.dart';
void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  String _text = "";
  StreamController<int> ctrl = StreamController<int>();

  void _incrementCounter() {
    _counter++;
    ctrl.add(_counter);
    _counter++;
    ctrl.add(_counter);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: ctrl.stream,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            _text += "${snapshot.data};";
          }
          return Text(_text);
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        child: const Icon(Icons.add),
      ),
    );
  }
}
f0ofjuux

f0ofjuux1#

好的,我在指向StreamBuilder文档的flutter github issues中找到了答案:
构建器由Flutter管道自行调用,因此将接收表示与流交互的快照的时序相关子序列。
因此,如果需要捕获所有数据,则不能使用StreamBuilder。:(
我现在摆脱了StreamBuilder,改用ChangeNotifier。

相关问题