Flutter StreamBuilder-错误状态:在一个屏幕上使用多个StreamBuilder
因为我在屏幕中使用了多个StreamBuilder,所以出现了一个错误的状态。 我知道我必须使用StreamController并将其与.broadcast()一起使用 因为我不自己创建流,我不知道如何更改这些流的控制器 这是我的代码:Flutter StreamBuilder-错误状态:在一个屏幕上使用多个StreamBuilder,flutter,dart,stream,stream-builder,Flutter,Dart,Stream,Stream Builder,因为我在屏幕中使用了多个StreamBuilder,所以出现了一个错误的状态。 我知道我必须使用StreamController并将其与.broadcast()一起使用 因为我不自己创建流,我不知道如何更改这些流的控制器 这是我的代码: class MyScreen extends StatefulWidget { @override _MyScreenState createState() => _MyScreenState(); } class _MyScreenState
class MyScreen extends StatefulWidget {
@override
_MyScreenState createState() => _MyScreenState();
}
class _MyScreenState extends State<MyScreen> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: [
StreamBuilder<List<int>>(
stream: streamOne?.value,
builder: (c, snapshot) {
final newValueOne = snapshot.data;
return Text(newValueOne);
}),
StreamBuilder<List<int>>(
stream: streamTwo?.value,
builder: (c, snapshot) {
final newValueTwo = snapshot.data;
return Text(newValueTwo);
}),
StreamBuilder<List<int>>(
stream: streamThree?.value,
builder: (c, snapshot) {
final newValueThree = snapshot.data;
return Text(newValueThree);
}),
],
),
),
);
}
}
class MyScreen扩展StatefulWidget{
@凌驾
_MyScreenState createState()=>\u MyScreenState();
}
类_MyScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
正文:专栏(
儿童:[
StreamBuilder(
stream:streamOne?值,
生成器:(c,快照){
最终newValueOne=snapshot.data;
返回文本(newValueOne);
}),
StreamBuilder(
stream:streamTwo?值,
生成器:(c,快照){
最终newValueTwo=snapshot.data;
返回文本(newValueTwo);
}),
StreamBuilder(
stream:streamThree?.值,
生成器:(c,快照){
最终newValueThree=snapshot.data;
返回文本(newValueThree);
}),
],
),
),
);
}
}
我试着将其作为广播流:
class MyScreen extends StatefulWidget {
@override
_MyScreenState createState() => _MyScreenState();
}
class _MyScreenState extends State<MyScreen> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: [
StreamBuilder<List<int>>(
stream: streamOne?.asBroadcastStream(),
builder: (c, snapshot) {
final newValueOne = snapshot.data;
return Text(newValueOne);
}),
StreamBuilder<List<int>>(
stream: streamTwo?.asBroadcastStream(),
builder: (c, snapshot) {
final newValueTwo = snapshot.data;
return Text(newValueTwo);
}),
StreamBuilder<List<int>>(
stream: streamThree?.asBroadcastStream(),
builder: (c, snapshot) {
final newValueThree = snapshot.data;
return Text(newValueThree);
}),
],
),
),
);
}
}
class MyScreen扩展StatefulWidget{
@凌驾
_MyScreenState createState()=>\u MyScreenState();
}
类_MyScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
正文:专栏(
儿童:[
StreamBuilder(
stream:streamOne?.asBroadcastStream(),
生成器:(c,快照){
最终newValueOne=snapshot.data;
返回文本(newValueOne);
}),
StreamBuilder(
stream:streamTwo?.asBroadcastStream(),
生成器:(c,快照){
最终newValueTwo=snapshot.data;
返回文本(newValueTwo);
}),
StreamBuilder(
stream:streamThree?.asBroadcastStream(),
生成器:(c,快照){
最终newValueThree=snapshot.data;
返回文本(newValueThree);
}),
],
),
),
);
}
}
这不起作用,给了我一个严重的状态错误
如果有人能在这里帮助我,那就太好了。
多谢各位 在streamBuilder中,您必须检查快照是否实际接收到数据,否则您的文本小部件将接收null,从而引发错误状态:
StreamBuilder<List<int>>(
stream: streamThree.asBroadcastStream(),
builder: (c, snapshot) {
if(snapshot.hasData){
final newValueThree = snapshot.data;
return Text(newValueThree);
} else {
// return any other widget like CircularProgressIndicator
}
}),
及
snpashot.connectionState==connectionState.active
及
snpashot.connectionState==connectionState.waiting
谢谢@Arnaud Delubac。我还必须检查从流中获取的数组是否为空:
StreamBuilder<List<int>>(
stream: streamThree.asBroadcastStream(),
builder: (c, snapshot) {
if (snapshot.hasData && snapshot.data.isNotEmpty && snapshot.connectionState == ConnectionState.active) {
final newValueThree = snapshot.data;
return Text(newValueThree);
} else {
// return any other widget like CircularProgressIndicator
}
}),
StreamBuilder(
stream:streamThree.asBroadcastStream(),
生成器:(c,快照){
if(snapshot.hasData&&snapshot.data.isNotEmpty&&snapshot.connectionState==connectionState.active){
最终newValueThree=snapshot.data;
返回文本(newValueThree);
}否则{
//返回任何其他小部件,如CircularProgressIndicator
}
}),