Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter StreamBuilder-错误状态:在一个屏幕上使用多个StreamBuilder_Flutter_Dart_Stream_Stream Builder - Fatal编程技术网

Flutter StreamBuilder-错误状态:在一个屏幕上使用多个StreamBuilder

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

因为我在屏幕中使用了多个StreamBuilder,所以出现了一个错误的状态。 我知道我必须使用StreamController并将其与.broadcast()一起使用

因为我不自己创建流,我不知道如何更改这些流的控制器

这是我的代码:

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
}
}),