StreamBuilder не реагирует на вызов StreamController.sink.add - PullRequest
1 голос
/ 27 марта 2019

В приложении 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 не перестраивается?

1 Ответ

0 голосов
/ 27 марта 2019

Возможно, проблема в том, что вы не ставите await при вызове bloc.getModels после сохранения или метод save выдает ошибку и прерывает метод, не запускающий getModels

...