2

我的 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不重建?

4

2 回答 2

0

希望这会对某人有所帮助:对我来说,问题是当我更新列表时,它实际上是存储在字段中的相同引用。每次创建一个新列表并且不将列表存储在同一字段中解决了它。我们无法从问题中看到您的 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
}

通过删除该字段,它现在更新了 StreamBuilder:

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
}
于 2019-09-17T11:00:28.563 回答
0

也许问题是您在保存后调用 bloc.getModels 时没有放置等待,或者保存方法给出错误并中断不运行 getModels 的方法

于 2019-03-27T13:32:46.413 回答