错误状态:调用 close 后无法添加新事件 - Flutter Modular

Wes*_*ont 6 dart flutter flutter-modular

我遇到以下错误“错误状态:调用关闭后无法添加新事件”当我第二次返回主页并访问 ProductsPage 时,

\n

第一次产品也会加载\n但是当我尝试再次加载ProductsPage 时,会抛出此错误。

\n
import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nimport '../../widgets/product_display.dart';\nimport '../../widgets/title_section.dart';\nimport '../home_page/components/button_menu.dart';\nimport 'bloc/products_bloc.dart';\nimport 'bloc/products_event.dart';\nimport 'bloc/products_state.dart';\n\nclass ProductsPage extends StatefulWidget {\n  const ProductsPage({Key? key}) : super(key: key);\n\n  @override\n  State<ProductsPage> createState() => _ProductsPageState();\n}\n\nclass _ProductsPageState extends State<ProductsPage> {\n  final bloc = Modular.get<ProductsBloc>();\n\n  @override\n  void initState() {\n    super.initState();\n    bloc.add(LoadProductsEvent());\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    bloc.close();\n    \n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('Produtos'),\n      ),\n      body: SafeArea(\n        child: SingleChildScrollView(\n            child: Padding(\n          padding: const EdgeInsets.all(10.0),\n          child: Column(\n            children: [\n              const SizedBox(\n                height: 10,\n              ),\n              const TextField(),\n              const TitleSection(title: 'Categorias'),\n              Container(\n                  margin: const EdgeInsets.all(10),\n                  height: 120,\n                  child: ListView(\n                    scrollDirection: Axis.horizontal,\n                    children: [\n                      ButtonMenu(\n                          action: () {},\n                          buttonName: 'Vestu\xc3\xa1rio',\n                          icon: Icons.store_mall_directory_rounded),\n                      ButtonMenu(\n                          action: () {},\n                          buttonName: 'Jogos',\n                          icon: Icons.sports_esports_outlined),\n                      ButtonMenu(\n                          action: () {},\n                          buttonName: 'Vouchers',\n                          icon: Icons.feed_outlined),\n                      ButtonMenu(\n                          action: () {},\n                          buttonName: 'Moskelines',\n                          icon: Icons.menu_book_outlined),\n                      ButtonMenu(\n                          action: () {},\n                          buttonName: 'Blusas',\n                          icon: Icons.paid_outlined),\n                    ],\n                  )),\n              Container(\n                margin: const EdgeInsets.all(10),\n                height: MediaQuery.of(context).size.height,\n                child: BlocBuilder<ProductsBloc, ProductsState>(\n                  bloc: bloc,\n                  builder: (context, state) {\n                    final state = bloc.state;\n\n                    if (state is ProductInicialState) {\n                      return const Center(\n                        child: CircularProgressIndicator(),\n                      );\n                    } else if (state is ProductSuccessState) {\n                      final productsList = state.products;\n                      return GridView.builder(\n                        gridDelegate:\n                            const SliverGridDelegateWithFixedCrossAxisCount(\n                          childAspectRatio: 0.7,\n                          crossAxisCount: 2,\n                          crossAxisSpacing: 10,\n                          mainAxisSpacing: 10,\n                        ),\n                        itemCount: productsList.length,\n                        itemBuilder: (context, index) {\n                          final item = productsList[index];\n                          return ProductDisplay(\n                              productEntity: productsList[index],\n                              icon: Icons.store_mall_directory_rounded,\n                              productName: item.productName,\n                              action: () {});\n                        },\n                      );\n                    } else {\n                      return Container();\n                    }\n                  },\n                ),\n              ),\n              const TitleSection(title: 'Produtos'),\n            ],\n          ),\n        )),\n      ),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的区块代码是:

\n
import 'package:bloc/bloc.dart';\n\nimport 'package:ConfidentialName/domain/usecases/get_all_products_usecase.dart';\n\nimport 'products_event.dart';\nimport 'products_state.dart';\n\nclass ProductsBloc extends Bloc<ProductsEvent, ProductsState> {\n  final GetAllProductsUsecase usecase;\n\n  ProductsBloc(\n    this.usecase,\n  ) : super(ProductInicialState()) {\n    on<LoadProductsEvent>((event, emit) async {\n      final result = await usecase.getAllProducts();\n      result.fold((l) => emit.call(ProductErrorState(l)),\n          (list) => emit.call(ProductSuccessState(list)));\n    });\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白为什么会发生这个错误

\n

Moh*_*hri 12

只需在发出状态之前检查该块是否已关闭。

if(isClosed) return; // Here
result.fold((l) => emit.call(ProductErrorState(l)),
          (list) => emit.call(ProductSuccessState(list)));
Run Code Online (Sandbox Code Playgroud)

另外,如果你想发出状态,请确保你没有处置该块,

像这样启动该集团

late ProductsBloc bloc;

  @override
  void initState() {
    super.initState();
    bloc = Modular.get<ProductsBloc>();
    bloc.add(LoadProductsEvent());
  }
Run Code Online (Sandbox Code Playgroud)

  • 我不知道肘节和块中的 `isClosed` 属性 - 我收到错误“错误状态:调用关闭后无法发出新状态”,因为我的肘节中有正在发出的流 - 添加一个 `!isClosed`检查为我解决了这个错误——在这里添加一条评论,希望 SEO 能够引导其他有“错误状态:调用关闭后无法发出新状态”的人找到这个答案 (3认同)

小智 5

当您将块绑定为单例时,flutter_modular 将会发生这种情况。将其更改为 app_module 文件中的 Bind.factory (依赖注入)。