Обмен между двумя StreamBuilder в зависимости от состояния моего соединения, которое обрабатывает мой BLOC - PullRequest
0 голосов
/ 13 февраля 2019

Я внедряю кэш для моего приложения в основном списке, в зависимости от состояния подключения.У меня есть BLOC, который контролирует состояние моего приложения, но он не меняется при изменении статуса моего соединения.

Это мой код в части моего пользовательского интерфейса:

      Container(
                color: Colors.white,
                child: RefreshIndicator(
                  key: _refreshIndicatorKey,
                  onRefresh: () async {
                    await Future.delayed(Duration(seconds: 1));
                    var connect = await bloc.checkConnection();
                    print('CONECT STATUS: $connect');
                  },
                  child: bloc.connectionChange
                      ? BasicListControl(key: UniqueKey(), stream: bloc.headlines, widthSize: widthSize)
                      : BasicListControl(key: UniqueKey(), stream: bloc.cacheList, widthSize: widthSize),
                      )
                ),

Это мойStreamBuilder:

StreamBuilder<UnmodifiableListView<Headlines>>(
        stream: stream,
        builder: (context, snapshot) {
          if (snapshot.data != null && snapshot.hasData) {
            //print('VALUE LIST: ${snapshot.data.toString()}');
            return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) {
                  print('VALUE LIST: ${snapshot.data.toString()}');
                  return ItemHeadlinesList(
                      key: UniqueKey(), headlines: snapshot.data[index]);
                });
          }
          return new OffLineBoard(widthSize: widthSize);
        });

Это часть моей структуры BLOC:

  bool get connectionChange => _connectionChangeSubject.stream.value;
  final _connectionChangeSubject = BehaviorSubject<bool>();
  bool _hasConnection = false;

  /// StatusConnection: isOnline, isOffline
  Sink<StatusConnection> get statusConnection =>
      _statusConnectionController.sink;
  final _statusConnectionController = StreamController<StatusConnection>();

RadioBloc() {
    _connectionChangeSubject.add(_hasConnection);
    checkConnection().then((val) {
      if (val) {
        _setPlayerStateController.add(PlayerState.playing);
        _connectionChangeSubject.add(_hasConnection);
        _getHeadlinesHttp(rssVillaClara);
      } else {
        _setPlayerStateController.add(PlayerState.stopped);
        _connectionChangeSubject.add(_hasConnection);
        _getHeadlinesCache(_cache);
      }
    });

    _statusConnectionController.stream.listen((value) {
      if (value == StatusConnection.isOnline) {
        _getHeadlinesHttp(rssVillaClara);
      } else {
        _getHeadlinesCache(_cache);
      }
    });
}

При наличии соединения все в порядке, кроме замены списка кэша списком онлайн-соединений, язаметил, что когда я зашел на другую страницу приложения и вернулся, если оно было обновлено и список изменился.

...