Поток (BLoC) не выдает значения при использовании в TabBarView - PullRequest
0 голосов
/ 30 января 2019

Я создаю TabBarView, и дочерние элементы этого представления создаются с использованием шаблона BLoC.Когда я использую основной поток в BLoC, я получил пустой результат на вкладках.Однако, когда я переключаю поток на BehaviorSubject, я получаю ожидаемый результат - страницы со списком.Почему базовые потоки дротиков не работают одинаково?

(я использую инъекцию зависимости от киви - работает нормально, никакие значения не равны нулю)

Класс BLoC (с потоком, замененным на BehaviorSubject) *

class EventsListBloc implements BlocBase{

  Repository _repo;
  StreamSubscription _agendaSub;

  BehaviorSubject<List<Event>> _subject;

  StreamController<List<Event>> _eventController = StreamController<List<Event>>.broadcast();
  Sink<List<Event>> get _eventsInput => _eventController.sink;
  Stream<List<Event>> get eventsStream => _subject.stream;//_eventController.stream;

  EventsListBloc(){
    _repo = getContainer()<Repository>();
    _subject = BehaviorSubject();

    _agendaSub = _repo.eventsList.listen(_updateAgenda);
  }

  _updateAgenda(List<Event> eventsList){
    //_eventsInput.add(eventsList);
    _subject.value = eventsList;
  }

  void dispose() {
    print("EventsListBloc: disposing");
    _eventController.close();
    _agendaSub.cancel();
    _subject.close();
  }
}

Контейнер TabBarView:

class AgendaPage extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return _AgendaPageState();
  }
}

class _AgendaPageState extends State<AgendaPage>{

  Widget _provideListView(){
    return BlocProvider(
        bloc: EventsListBloc(),
        child: AgendaListWidget()
    );
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
          appBar: AppBar(
            title: Center(
                child: Text('Agenda')
            ),
            bottom: TabBar(
              tabs: <Widget>[
                Tab(
                  text: "test 1",
                ),
                Tab(
                  text: "test 2",
                )
              ],
            )//tabsy,
          ),
          body: TabBarView(
              children: [_provideListView(), _provideListView()]
          ),
      ),
    );
  }
}

Страница вкладок (ListView, использующий указанный BLoC)

class AgendaListWidget extends StatefulWidget{

  @override
  _AgendaListWidgetState createState() {
    return new _AgendaListWidgetState();
  }
}

class _AgendaListWidgetState extends State<AgendaListWidget> {

  Widget _buildItem(BuildContext context, Event event){
    var item = Card(
      child: Text(event.title),
    );

    return item;
  }

  Widget _buildList(BuildContext context){
    final eventsBloc = BlocProvider.of<EventsListBloc>(context);

    assert(eventsBloc != null);

    var result = StreamBuilder<List<Event>>(
      stream: eventsBloc.eventsStream,
      builder: (BuildContext context, AsyncSnapshot<List<Event>> snapshot) {
        if(snapshot.hasData){
          var result = ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext context, int index) =>
              _buildItem(context, snapshot.data[index])
            ,
          );

          return result;
        }else{
          return const Text("Empty");
        }
      },
    );

    return result;
  }

  @override
  Widget build(BuildContext context) {
    return _buildList(context);
  }
}

Результат для BehaviorSubject: BehabiorSubject

Результат для потоков: Streams

...