Wes*_*ont 6 dart flutter flutter-modular
我遇到以下错误“错误状态:调用关闭后无法添加新事件”当我第二次返回主页并访问 ProductsPage 时,
\n第一次产品也会加载\n但是当我尝试再次加载ProductsPage 时,会抛出此错误。
\nimport '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}\nRun Code Online (Sandbox Code Playgroud)\n我的区块代码是:
\nimport '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}\nRun Code Online (Sandbox Code Playgroud)\n我不明白为什么会发生这个错误
\nMoh*_*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)
| 归档时间: |
|
| 查看次数: |
8722 次 |
| 最近记录: |