Flutter Bloc 8.1.1中this.state引用无效错误求助
问题:Flutter Bloc 8.1.1中ItemAdd事件处理里
this.state引用无效的错误 使用Flutter Bloc 8.1.1开发时,在ItemAdd事件的处理函数中遇到this.state引用无效的错误,相关错误截图如下:
- 错误截图1:

- 错误截图2:

原代码如下:
import 'dart:async'; import 'package:foodapptest/models/basket_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../models.dart'; import 'package:foodapptest/ResturantMenuItem.dart'; part 'basket_event.dart'; part 'basket_state.dart'; class BasketBloc extends Bloc<BasketEvent,BasketState> //TO do fix bloc { BasketBloc() : super(BasketLoading()) { on<BasketStart>(_onStartBasket); on<ItemAdd>(_onAddItem); } } Future<void> _onStartBasket( BasketStart event, Emitter<BasketState> emit, ) async { emit( BasketLoading()); try{ emit(BasketLoaded(basket: Basket(),),); }catch (e) { print(e); } } Future<void> _onAddItem( ItemAdd event, Emitter<BasketState> emit, ) async { final state = this.state; if(state is BasketLoaded) { try { emit(BasketLoaded(basket: state.basket.copyWith(items: List.from(state.basket.items)..add(event.item)))); } catch (_) {} } } }
解决方案
问题根源是代码结构的语法错误,导致事件处理函数不在BasketBloc类的作用域内,无法访问this.state:
BasketBloc类的闭合大括号}提前结束,把_onStartBasket和_onAddItem排除在了类成员之外,变成全局函数,自然无法用this访问Bloc的state。_onAddItem函数末尾多了一个多余的闭合大括号。
修正后的代码:
import 'dart:async'; import 'package:foodapptest/models/basket_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../models.dart'; import 'package:foodapptest/ResturantMenuItem.dart'; part 'basket_event.dart'; part 'basket_state.dart'; class BasketBloc extends Bloc<BasketEvent,BasketState> { BasketBloc() : super(BasketLoading()) { on<BasketStart>(_onStartBasket); on<ItemAdd>(_onAddItem); } Future<void> _onStartBasket( BasketStart event, Emitter<BasketState> emit, ) async { emit(BasketLoading()); try { emit(BasketLoaded(basket: Basket())); } catch (e) { print(e); } } Future<void> _onAddItem( ItemAdd event, Emitter<BasketState> emit, ) async { final state = this.state; if(state is BasketLoaded) { try { emit(BasketLoaded( basket: state.basket.copyWith( items: List.from(state.basket.items)..add(event.item) ) )); } catch (_) {} } } }
修改要点
- 移除
BasketBloc构造函数后面多余的闭合大括号,让两个事件处理函数成为类的成员方法。 - 移除
_onAddItem函数末尾多余的闭合大括号,保证代码结构正确。 - 调整代码缩进,提升可读性。
修改后,this.state就能正确访问Bloc的当前状态,因为函数现在属于BasketBloc类的成员,作用域合法。
内容的提问来源于stack exchange,提问作者Haitham Dahrooj
相关产品推荐
相关产品推荐

