Dart 调用StreamController.sink.add时,StreamBuilder没有反应

Dart 调用StreamController.sink.add时,StreamBuilder没有反应,dart,flutter,stream,bloc,stream-builder,Dart,Flutter,Stream,Bloc,Stream Builder,我的颤振应用程序中有一个专门用于编辑对象列表的屏幕。当您按下编辑按钮时,会弹出一个模式,允许您编辑对象值。关闭模型时,列表将通过一个BLoC刷新。但是,当调用刷新列表的方法时,什么也不会发生 bloc.dart class集团{ final _provider=ModelProvider(); 最终_controller=StreamController(); Stream get models=>\u controller.Stream; void getModels()异步{ 最终列表模型

我的颤振应用程序中有一个专门用于编辑对象列表的屏幕。当您按下编辑按钮时,会弹出一个模式,允许您编辑对象值。关闭模型时,列表将通过一个BLoC刷新。但是,当调用刷新列表的方法时,什么也不会发生

bloc.dart
class集团{
final _provider=ModelProvider();
最终_controller=StreamController();
Stream get models=>\u controller.Stream;
void getModels()异步{
最终列表模型=等待_provider.readAll();
_控制器.接收器.添加(模型);
}
未来存储模型(模型)异步{
final int id=wait_provider.write(模型);
返回id;
}
}
class ListScreen扩展了无状态小部件{
最终集团=集团();
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:自定义滚动视图(
条子:[
//滑动条。。。
StreamBuilder(
流:集团模型,
生成器:(上下文,快照){
if(snapshot.hasData){
返回ListView.builder(
itemCount:snapshot.data.length,
itemBuilder:(上下文,索引)=>
列表砖(
标题:文本(快照.数据[索引].名称),
按下:()=>\u编辑模型(上下文),
),
),
}否则{
bloc.getModels();
返回容器();
}
}          
),
],
),
);
}
void\u editModel(BuildContext上下文)异步{
最终模型已编辑=等待显示对话框(
上下文:上下文,
生成器:(上下文)=>EditModal(),
);
如果(已编辑!=null){
wait bloc.saveModel(已编辑);
bloc.getModels();
}
}
}

我知道数据正确地存储在数据库中,因为如果我转到上一个屏幕,然后返回编辑屏幕,数据就会更新。有人能帮我弄清楚为什么StreamBuilder没有重建吗?

可能问题在于保存后没有将wait when calls bloc.getModels放在后面,或者save方法出现错误并破坏了不运行getModels的方法,希望这能帮助某人:对我来说,这个问题,当我更新列表时,它实际上是存储在字段中的同一个引用。每次创建一个新列表,但不将列表存储在同一字段中,可以解决此问题。我们无法从问题中看到ModelProvider的内部,但看起来可能是同一个问题

第一次更新后未更新:

class MiniaturePaintsBloc implements Bloc {

  List<MiniaturePaint> _miniaturePaints;

  final _controller = StreamController<List<MiniaturePaint>>.broadcast();

  Stream<List<MiniaturePaint>> get miniaturePaintsStream => _controller.stream;

  void fetchMiniaturePaints() async {
    QuerySnapshot querySnapshot =
        await Firestore.instance.collection("MiniaturePaints").getDocuments(source: Source.serverAndCache);
    _miniaturePaints = querySnapshot.documents.map((doc) => _docToMiniaturePaint(doc)).toList();
    _controller.sink.add(_miniaturePaints);
  }

  //rest of BloC code here
}
class MiniaturePaintsBloc implements Bloc {

  final _controller = StreamController<List<MiniaturePaint>>.broadcast();

  Stream<List<MiniaturePaint>> get miniaturePaintsStream => _controller.stream;

  void fetchMiniaturePaints() async {
    QuerySnapshot querySnapshot =
        await Firestore.instance.collection("MiniaturePaints").getDocuments(source: Source.serverAndCache);
    List<MiniaturePaint> miniaturePaints = querySnapshot.documents.map((doc) => _docToMiniaturePaint(doc)).toList();
    _controller.sink.add(miniaturePaints);
  }

  //rest of BLoC code here
}
class MiniaturePaintsBloc实现了Bloc{
列出微型画;
final _controller=StreamController.broadcast();
Stream get MINATIATUREPAINTSSSTREAM=>\u controller.Stream;
void fetchMiniaturePaints()异步{
QuerySnapshot QuerySnapshot=
等待Firestore.instance.collection(“MiniaturePaints”).getDocuments(来源:source.serverAndCache);
_miniaturePaints=querySnapshot.documents.map((doc)=>\u docoministraturePaint(doc)).toList();
_controller.sink.add(_miniaturePaints);
}
//其余的代码在这里
}
通过删除该字段,它现在更新StreamBuilder:

class MiniaturePaintsBloc implements Bloc {

  List<MiniaturePaint> _miniaturePaints;

  final _controller = StreamController<List<MiniaturePaint>>.broadcast();

  Stream<List<MiniaturePaint>> get miniaturePaintsStream => _controller.stream;

  void fetchMiniaturePaints() async {
    QuerySnapshot querySnapshot =
        await Firestore.instance.collection("MiniaturePaints").getDocuments(source: Source.serverAndCache);
    _miniaturePaints = querySnapshot.documents.map((doc) => _docToMiniaturePaint(doc)).toList();
    _controller.sink.add(_miniaturePaints);
  }

  //rest of BloC code here
}
class MiniaturePaintsBloc implements Bloc {

  final _controller = StreamController<List<MiniaturePaint>>.broadcast();

  Stream<List<MiniaturePaint>> get miniaturePaintsStream => _controller.stream;

  void fetchMiniaturePaints() async {
    QuerySnapshot querySnapshot =
        await Firestore.instance.collection("MiniaturePaints").getDocuments(source: Source.serverAndCache);
    List<MiniaturePaint> miniaturePaints = querySnapshot.documents.map((doc) => _docToMiniaturePaint(doc)).toList();
    _controller.sink.add(miniaturePaints);
  }

  //rest of BLoC code here
}
class MiniaturePaintsBloc实现了Bloc{
final _controller=StreamController.broadcast();
Stream get MINATIATUREPAINTSSSTREAM=>\u controller.Stream;
void fetchMiniaturePaints()异步{
QuerySnapshot QuerySnapshot=
等待Firestore.instance.collection(“MiniaturePaints”).getDocuments(来源:source.serverAndCache);
List miniaturePaints=querySnapshot.documents.map((doc)=>\u doctoministraturepaint(doc)).toList();
_controller.sink.add(微型画);
}
//其余的代码在这里
}

使用
wait
Bloc.getModels
将不起作用,因为它不会返回
未来的
,我知道数据存储正确,因为我可以在
Bloc.getModels
中打印
模型
,并查看它是否获取更新的数据。您解决了这个问题吗?我刚刚进入颤振开发阶段,经历了这个问题。我从未解决过这个问题。我转投给州管理提供商,但这对我来说很容易,因为我处于开发的早期阶段。从技术上讲,这是做完全相同的事情。没什么区别。您正在将两个代码段中的_miniaturePaints列表更改为不同的列表。一个是字段这一事实没有什么区别,因为它是我们想要的数据,而不是字段或变量。