[英]Bad State: Cannot add new events after calling close - Flutter Modular
當我返回主頁並第二次訪問 ProductsPage 時,我遇到以下錯誤“錯誤 State:調用關閉后無法添加新事件” 。
產品也是第一次加載但是當我嘗試再次加載 ProductsPage 時,會拋出此錯誤。
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';
import '../../widgets/product_display.dart';
import '../../widgets/title_section.dart';
import '../home_page/components/button_menu.dart';
import 'bloc/products_bloc.dart';
import 'bloc/products_event.dart';
import 'bloc/products_state.dart';
class ProductsPage extends StatefulWidget {
const ProductsPage({Key? key}) : super(key: key);
@override
State<ProductsPage> createState() => _ProductsPageState();
}
class _ProductsPageState extends State<ProductsPage> {
final bloc = Modular.get<ProductsBloc>();
@override
void initState() {
super.initState();
bloc.add(LoadProductsEvent());
}
@override
void dispose() {
super.dispose();
bloc.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Produtos'),
),
body: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
children: [
const SizedBox(
height: 10,
),
const TextField(),
const TitleSection(title: 'Categorias'),
Container(
margin: const EdgeInsets.all(10),
height: 120,
child: ListView(
scrollDirection: Axis.horizontal,
children: [
ButtonMenu(
action: () {},
buttonName: 'Vestuário',
icon: Icons.store_mall_directory_rounded),
ButtonMenu(
action: () {},
buttonName: 'Jogos',
icon: Icons.sports_esports_outlined),
ButtonMenu(
action: () {},
buttonName: 'Vouchers',
icon: Icons.feed_outlined),
ButtonMenu(
action: () {},
buttonName: 'Moskelines',
icon: Icons.menu_book_outlined),
ButtonMenu(
action: () {},
buttonName: 'Blusas',
icon: Icons.paid_outlined),
],
)),
Container(
margin: const EdgeInsets.all(10),
height: MediaQuery.of(context).size.height,
child: BlocBuilder<ProductsBloc, ProductsState>(
bloc: bloc,
builder: (context, state) {
final state = bloc.state;
if (state is ProductInicialState) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (state is ProductSuccessState) {
final productsList = state.products;
return GridView.builder(
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
childAspectRatio: 0.7,
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
itemCount: productsList.length,
itemBuilder: (context, index) {
final item = productsList[index];
return ProductDisplay(
productEntity: productsList[index],
icon: Icons.store_mall_directory_rounded,
productName: item.productName,
action: () {});
},
);
} else {
return Container();
}
},
),
),
const TitleSection(title: 'Produtos'),
],
),
)),
),
);
}
}
我的集團代碼是:
import 'package:bloc/bloc.dart';
import 'package:ConfidentialName/domain/usecases/get_all_products_usecase.dart';
import 'products_event.dart';
import 'products_state.dart';
class ProductsBloc extends Bloc<ProductsEvent, ProductsState> {
final GetAllProductsUsecase usecase;
ProductsBloc(
this.usecase,
) : super(ProductInicialState()) {
on<LoadProductsEvent>((event, emit) async {
final result = await usecase.getAllProducts();
result.fold((l) => emit.call(ProductErrorState(l)),
(list) => emit.call(ProductSuccessState(list)));
});
}
}
我不明白為什么會發生此錯誤
只需在發出狀態之前檢查 bloc 是否已關閉。
if(isClosed) return; // Here
result.fold((l) => emit.call(ProductErrorState(l)),
(list) => emit.call(ProductSuccessState(list)));
另外,如果您想發出狀態,請確保您沒有處理該集團,
像這樣發起集團
late ProductsBloc bloc;
@override
void initState() {
super.initState();
bloc = Modular.get<ProductsBloc>();
bloc.add(LoadProductsEvent());
}
當您將 bloc 綁定為 Singleton 時,flutter_modular 會發生這種情況。將其更改為 app_module 文件中的 Bind.factory(依賴注入)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.