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

Flutter Bloc:如何在Cubit内使用CubitState的变量?

如何从Cubit的AnswerPicked状态中获取参数?

我看你遇到的问题是在Cubit的takeAnswer方法里没办法访问AnswerPicked状态中的answer参数对吧?问题出在Dart的类型检查上——虽然你用if(state is AnswerPicked)判断了当前状态的类型,但Dart不会自动把父类型AnswerState转换成子类型AnswerPicked,所以直接写state.answer会报错,因为父类没有这个属性。

另外你尝试的AnswerPicked().answer完全是创建了一个新的AnswerPicked实例,它的answer是默认的null,肯定拿不到之前选中的答案,这是个误区哦。

给你两种可行的解决方法:

方法一:类型强转(兼容所有Dart版本)

在if代码块里把state强转为AnswerPicked类型,然后用这个强转后的变量访问answer:

void takeAnswer(String questionAnswer, int type) {
  if(state is AnswerPicked){
    // 强转状态为AnswerPicked并赋值给变量
    final pickedState = state as AnswerPicked;
    userAnswersList.add(pickedState.answer);
    scoreCubit.checkAnswer(pickedState.answer, questionAnswer, type);
  }
  emit(AnswerInitial());
}

方法二:使用模式匹配(Dart 3.0+推荐)

如果你的项目用的是Dart 3.0及以上版本,用模式匹配会更简洁,直接在if条件里解构出answer:

void takeAnswer(String questionAnswer, int type) {
  if(state case AnswerPicked(answer: final answer)){
    userAnswersList.add(answer);
    scoreCubit.checkAnswer(answer, questionAnswer, type);
  }
  emit(AnswerInitial());
}

额外优化建议

另外,你的AnswerPicked类最好完善一下Equatable的props实现,这样Cubit能正确判断状态是否变化,避免无效的emit:

class AnswerPicked extends AnswerState {
  final String answer;
  // 建议把answer改成必填参数,防止意外传入null
  const AnswerPicked({ required this.answer, });

  @override
  List<Object> get props => [answer];

  @override
  String toString() => '{AnswerPicked: $answer}';
}

内容的提问来源于stack exchange,提问作者Goldlightdrake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:57:57