【问题标题】:Flutter BLoC stream disposed with listview.builder使用 listview.builder 处理的 Flutter BLoC 流
【发布时间】: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],
                    );
                  }
                }
              );
            }
          }
        ),
      );
    }
  }

【问题讨论】:

    标签: flutter bloc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 2023-02-20
      • 2019-05-23
      • 2020-01-26
      • 2023-02-16
      • 2019-06-13
      • 2021-01-13
      • 2023-03-12
      • 2021-03-04
      相关资源
      最近更新 更多