Flutter BLoC流由listview.builder处理

时间:2019-06-12 03:05:17

标签: flutter bloc

我试图将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],
                    );
                  }
                }
              );
            }
          }
        ),
      );
    }
  }

1 个答案:

答案 0 :(得分:0)

我也面临同样的问题。 我很不情愿地使用流属性isClosed,如果它是真的,我什么也不做。