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



我的 Flutter 应用程序中有一个屏幕专门用于编辑对象列表。当您按下编辑按钮时,会弹出一个模式,允许您编辑对象值。关闭模型时,列表将通过 BLoC 刷新。但是,调用刷新列表的方法时,没有任何反应。

bloc.dart
class Bloc {
  final _provider = ModelProvider();
  final _controller = StreamController<List<Model>>();
  Stream<List<Model>> get models => _controller.stream;
  void getModels() async {
    final List<Model> models = await _provider.readAll();
    _controller.sink.add(models);
  }
  Future<int> saveModel(Model model) async {
    final int id = await _provider.write(model);
    return id;
  }
}
list_screen.dart
class ListScreen extends StatelessWidget {
  final bloc = Bloc();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          // SliverAppBar ...
          StreamBuilder<List<Model>>(
            stream: bloc.models,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (context, index) =>
                      ListTile(
                        title: Text(snapshot.data[index].name),
                        onPressed: () => _editModel(context),
                      ),
                ),
              } else {
                bloc.getModels();
                return Container();
              }
            }          
          ),
        ],
      ),
    );
  }
  void _editModel(BuildContext context) async {
    final Model edited = await showDialog(
      context: context,
      builder: (context) => EditModal(),
    );
    if (edited != null) {
      await bloc.saveModel(edited);
      bloc.getModels();
    }
  }
}

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

也许问题是您在保存后调用 bloc.getModels 时没有放置 await,或者 save 方法给出错误并破坏未运行 getModels 的方法

希望这会对某人有所帮助: 对我来说,问题是,当我更新列表时,它实际上是存储在字段中的相同引用。每次创建一个新列表并且不将列表存储在同一字段中就可以解决问题。我们无法从问题中看到模型提供程序的内部,但看起来可能是相同的问题。

这在第一次后没有更新:

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
}

最新更新