You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Bloc 8.1.1中this.state引用无效错误求助

问题:Flutter Bloc 8.1.1中ItemAdd事件处理里this.state引用无效的错误

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

  • 错误截图1:错误截图1
  • 错误截图2:错误截图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:

  1. BasketBloc类的闭合大括号}提前结束,把_onStartBasket和_onAddItem排除在了类成员之外,变成全局函数,自然无法用this访问Bloc的state。
  2. _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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:49:14