看起来好像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),
),
);
}
}
1条答案
按热度按时间f0ofjuux1#
好的,我在指向StreamBuilder文档的flutter github issues中找到了答案:
构建器由Flutter管道自行调用,因此将接收表示与流交互的快照的时序相关子序列。
因此,如果需要捕获所有数据,则不能使用StreamBuilder。:(
我现在摆脱了StreamBuilder,改用ChangeNotifier。