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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 流已被侦听,更改屏幕后出错_Flutter_Dart_Bloc - Fatal编程技术网

Flutter 流已被侦听,更改屏幕后出错

Flutter 流已被侦听,更改屏幕后出错,flutter,dart,bloc,Flutter,Dart,Bloc,我在应用程序中应用了Bloc模式,在通过底部导航更改屏幕时遇到了问题 我试图制作一个流广播,但是在改变屏幕后,数据消失了 这是我的主类,它代表主屏幕 class Home extends StatefulWidget { @override _HomeState createState() => _HomeState(); } class _HomeState extends State<Home> { final DepartmentBloc departmen

我在应用程序中应用了Bloc模式,在通过底部导航更改屏幕时遇到了问题

我试图制作一个流广播,但是在改变屏幕后,数据消失了

这是我的主类,它代表主屏幕

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final DepartmentBloc departmentBloc = BlocProvider.getBloc<DepartmentBloc>();
  final PromotionProductBloc promotionProductBloc = BlocProvider.getBloc<PromotionProductBloc>();

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      physics: BouncingScrollPhysics(),
      child: SafeArea(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            CustomText(
              text: "Promoções",
              fontSize: 20.0,
              padding: EdgeInsets.only(left: 12.0),
            ),
            StreamBuilder(
              stream: promotionProductBloc.outPromotionProducts,
              builder: (context, snapshot) {
                if (snapshot.hasData)
                  return Container(
                    height: 230.0,
                    child: ListView.builder(
                      padding: EdgeInsets.only(
                          left: 12.0, right: 12.0, bottom: 10.0),
                      itemBuilder: (context, index) {
                        return PromotionProductCard(snapshot.data[index]);
                      },
                      itemCount: snapshot.data.length,
                      scrollDirection: Axis.horizontal,
                      physics: BouncingScrollPhysics(),
                    ),
                  );
                else
                  return Container(
                    height: 200.0,
                  );
              },
            ),
            CustomText(
              text: "Categorias",
              fontSize: 20.0,
              padding: EdgeInsets.only(left: 12.0, top: 20.0, bottom: 10.0),
            ),
            StreamBuilder(
              stream: departmentBloc.outDepartments,
              builder: (context, snapshot) {
                if (snapshot.hasData)
                  return Container(
                    height: 120.0,
                    child: ListView.builder(
                      padding: EdgeInsets.only(left: 12.0, right: 12.0),
                      itemBuilder: (context, index) {
                        return CategoryCard(snapshot.data[index]);
                      },
                      itemCount: snapshot.data.length,
                      scrollDirection: Axis.horizontal,
                      physics: BouncingScrollPhysics(),
                    ),
                  );
                else
                  return Container(
                    height: 100.0,
                  );
              },
            ),
          ],
        ),
      ),
    );
  }
class Home扩展StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
final DepartmentBloc DepartmentBloc=BlocProvider.getBloc();
最终促销ProductBloc促销ProductBloc=BlocProvider.getBloc();
@凌驾
小部件构建(构建上下文){
返回SingleChildScrollView(
物理:弹跳CrollPhysics(),
儿童:安全区(
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
自定义文本(
案文:“宣传”,
字体大小:20.0,
填充:仅限边缘设置(左:12.0),
),
StreamBuilder(
流:promotionProductBloc.outPromotionProducts,
生成器:(上下文,快照){
if(snapshot.hasData)
返回容器(
高度:230.0,
子项:ListView.builder(
填充:仅限边缘设置(
左:12.0,右:12.0,下:10.0),
itemBuilder:(上下文,索引){
返回促销产品卡(快照.数据[索引]);
},
itemCount:snapshot.data.length,
滚动方向:轴水平,
物理:弹跳CrollPhysics(),
),
);
其他的
返回容器(
高度:200.0,
);
},
),
自定义文本(
文本:“分类”,
字体大小:20.0,
填充:仅限边缘设置(左侧:12.0,顶部:20.0,底部:10.0),
),
StreamBuilder(
流程:departmentBloc.outDepartments,
生成器:(上下文,快照){
if(snapshot.hasData)
返回容器(
身高:120.0,
子项:ListView.builder(
填充:仅限边设置(左:12.0,右:12.0),
itemBuilder:(上下文,索引){
返回CategoryCard(快照.数据[索引]);
},
itemCount:snapshot.data.length,
滚动方向:轴水平,
物理:弹跳CrollPhysics(),
),
);
其他的
返回容器(
高度:100.0,
);
},
),
],
),
),
);
}
下面是访问服务以获取数据并打开流出口的类

class DepartmentBloc extends BlocBase {

  DepartmentService departmentService;

  List<Department> departments;

  final StreamController<List<Department>> _departmentController = StreamController<List<Department>>();
  Stream<List<Department>> get outDepartments => _departmentController.stream;

  DepartmentBloc() {
    departmentService = DepartmentService();
    getAll();
  }

  void getAll() async {
    departments =  await departmentService.getAll();
    _departmentController.sink.add(departments);
  }

  @override
  void dispose() {
    _departmentController.close();
    super.dispose();
  }
}
class DepartmentBloc扩展了BlocBase{
部门服务部门服务;
列出部门名单;
最终StreamController _departmentController=StreamController();
Stream get out departments=>\u departmentController.Stream;
部门集团(){
departmentService=departmentService();
getAll();
}
void getAll()异步{
departments=wait departmentService.getAll();
_departmentController.sink.add(部门);
}
@凌驾
无效处置(){
_departmentController.close();
super.dispose();
}
}
PromotionProductBloc与DepartmentBloc相同,它只更改服务访问权限

我正在使用底部导航,在转到另一个屏幕并返回后出现以下错误:流已被侦听。

尝试

final StreamController\u departmentController=StreamController.broadcast();
似乎您使用的是单个订阅流控制器。它们只能被侦听一次。它们的一个优点是,第一个侦听器将接收在订阅之前发出的事件。广播流不保证这种行为,但它们可以被多次订阅。

试试看

final StreamController\u departmentController=StreamController.broadcast();

似乎您使用的是单个订阅流控制器。它们只能被侦听一次。它们的一个优点是,第一个侦听器将接收在订阅之前发出的事件。广播流不保证这种行为,但它们可以被多次订阅。

为了补充您的答案,请r好的做法,当然,在将来,可以去看看RxDart库。学习这三门课程将促进更多的知识。当我改变屏幕时,广播使数据消失。我想我设法解决了这个问题:final _departmentController=BehaviorSubject.seeded(List());为了补充你的答案,另一个好的实践,当然,在未来,是去看看RxDart库。学习这三门课程将更加方便他的知识广播使数据在我改变屏幕时消失。我想我设法解决了这个问题:final _departmentController=BehaviorSubject.seed(List());