Я пытаюсь использовать 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],
);
}
}
);
}
}
),
);
}
}