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
相关产品推荐
相关产品推荐

