Поток Floter BLoC с помощью listview.builder - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь использовать listview.builder с потоком, но постоянно получаю сообщение об ошибке «StateError (плохое состояние: невозможно добавить новые события после вызова close)».Если я удаляю утилизацию, ошибка исчезает.Я знаю, что ошибка вызвана тем, что dispose вызывается до того, как все данные загружаются в компоновщик, но я не знаю, как предотвратить проблему.

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

Я видел предложение использовать сток в расположении BLoC, например:

void dispose() async {
  await _myStream.drain();
  _myStream.close();
}

, но также не имел успеха с этим.

Ниже приведен код, с которым у меня возникла проблема, проблема возникает с построителем потока postBloc.post:

class HomeScreen extends StatefulWidget {
    @override
    _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
    PostBloc postBloc;

    @override
    void initState() {
      postBloc = PostBloc();
      super.initState();
    }

    @override
    void dispose() {
      postBloc.dispose();
      super.dispose();
    }

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        endDrawer: AppDrawer(),
        appBar: AppBar(
          title: Text('Home'),
        ),
        body: StreamBuilder(
          stream: postBloc.isPostLoading,
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.hasData && snapshot.data) {
              return Center(
                child: CircularProgressIndicator(),
              );
            } else {
              postBloc.refreshPostsIfNeeded();
              return StreamBuilder<UnmodifiableListView<Post>>(
                stream: postBloc.posts,
                initialData: UnmodifiableListView<Post>([]),
                builder: (BuildContext context, AsyncSnapshot<UnmodifiableListView<Post>> snapshot) {
                  if (snapshot.hasData) {
                    return ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (BuildContext context, int index) =>
                        snapshot.data.map((data) => _buildPosts(context, data, postBloc)).toList()[index],
                    );
                  }
                }
              );
            }
          }
        ),
      );
    }
  }
...