【发布时间】:2019-10-26 11:47:20
【问题描述】:
我正在尝试将 listview.builder 与流一起使用,但我不断收到错误“StateError(错误状态:调用关闭后无法添加新事件)”。如果我删除 dispose,错误就会消失。我知道错误是因为在构建器中加载所有数据之前调用了 dispose,但我不知道如何防止该问题。
我尝试使用 AutomaticKeepAliveClientMixin,但这没有帮助。如果我使用继承的小部件并从另一个页面获取数据而不是在此页面中创建 BLoC,我不会收到错误消息,但如果我实际上不需要除了防止此错误之外,继承的小部件。
我看到一个建议在 BLoC 的 dispose 中使用排水管,例如:
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],
);
}
}
);
}
}
),
);
}
}
【问题讨论】: