Как установить соединение в состояние ожидания с помощью StreamBuilder во флаттере

Мое требование - перевести это состояние подключения StreamBuilder в состояние ожидания.

Я использую тему публикации, всякий раз, когда я хочу загрузить данные в построитель потока, я просто добавляю данные в приемник, вызывая метод postStudentsToAssign (), здесь этот метод выполняет вызов API, который занимает некоторое время , в то время я хочу, чтобы это состояние подключения streamBuilder ожидало

Конструктор потоков:

StreamBuilder(
            stream: studentsBloc.studentsToAssign,
            // initialData: [],
            builder: (context, snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.waiting:
                  // While waiting for the data to load, show a loading spinner.
                  return getLoader();
                default:
                  if (snapshot.hasError)
                    return  Center(child: Text('Error: ${snapshot.error}'));
                  else
                    return  _getDrawer(snapshot.data);
              }
            }),

Инициализация наблюдаемого:

 final _assignStudentSetter = PublishSubject<dynamic>();

 Observable<List<AssignMilestoneModel>> get studentsToAssign =>
      _studentsToAssignFetcher.stream;

Метод добавления данных в поток:

 postStudentsToAssign(int studyingClass, String milestoneId, String subject,
      List studentList) async {
    var response = await provider.postAssignedStudents(
        studyingClass, milestoneId, subject, studentList);
    _assignStudentSetter.sink.add(response);
  }

person krishnaji    schedule 12.09.2019    source источник


Ответы (1)


Вы можете отправить null в поток, поэтому snapshot.connectionState изменится на active. Не знаю, почему и является ли это официальным решением, но оно работает (по крайней мере, сейчас). Я нашел это случайно. Я хотел бы, чтобы команда Flutter объяснила, как установить состояние соединения для моментального снимка. Это не ясно из документации StreamBuilder. Похоже, вам следует заменить поток на новый, чтобы snapshot находился в состоянии waiting. Но это опять же логика, которую вы хотите реализовать.

Я проверил источник StreamBuilder, чтобы узнать, что AsyncSnapshot.connectionState начинается как waiting (после подключения потока), после получения данных, изменяющихся на active. snapshot.hasData возвращает истину, если snapshot.data != null. Вот как работает следующий код.

class SearchScreen extends StatelessWidget {

  final StreamController<SearchResult> _searchStreamController = StreamController<SearchResult>();
  final SearchService _service = SearchService();

  void _doSearch(String text) async {
    if (text?.isNotEmpty ?? false) {
      _searchStreamController.add(null);
      _searchService.search(text)
          .then((SearchResult result) => _searchStreamController.add(result))
          .catchError((e) => _searchStreamController.addError(e));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(children: <Widget>[
        SearchBar(
          onChanged: (text) => _doSearch(text),
        ),
        StreamBuilder<SearchResult>(
          stream: _searchStreamController.stream,
          builder: (BuildContext context, AsyncSnapshot<SearchResult> snapshot) {
            Widget widget;
            if (snapshot.hasData) {
              widget = Expanded(
                // show search result
              );
            }
            else if (snapshot.hasError) {
              widget = Expanded(
                 // show error
              );
            }
            else if(snapshot.connectionState == ConnectionState.active){
              widget = Expanded(
                // show loading
              );
            }
            else {
              // empty
              widget = Container();
            }
            return widget;
          },
        ),
      ]),
    );
  }
}
person Martin Edlman    schedule 06.02.2020