Flutter Bloc:如何在Cubit内部获取CubitState中的变量?
解决Cubit中获取AnswerPicked状态参数的问题
你的问题核心在于Dart的类型推断不会自动提升已检查类型的变量,而且你错误地创建了新的AnswerPicked实例来获取参数,这当然拿不到之前保存的answer值。下面是具体的解决办法:
1. 显式类型转换(兼容所有Dart版本)
在判断state is AnswerPicked后,把state强转为AnswerPicked类型,就能访问它的answer属性了:
void takeAnswer(String questionAnswer, int type) { if(state is AnswerPicked){ // 将state强转为AnswerPicked类型 final pickedState = state as AnswerPicked; userAnswersList.add(pickedState.answer); scoreCubit.checkAnswer(pickedState.answer, questionAnswer, type); } emit(AnswerInitial()); }
2. Dart 3.0+ 模式匹配(更简洁)
如果你的项目使用Dart 3.0及以上版本,可以用模式匹配直接解构状态中的参数,代码更清爽:
void takeAnswer(String questionAnswer, int type) { // 直接匹配AnswerPicked并提取answer if (state case AnswerPicked(answer: final userAnswer)) { userAnswersList.add(userAnswer); scoreCubit.checkAnswer(userAnswer, questionAnswer, type); } emit(AnswerInitial()); }
额外优化建议
为了让状态管理更规范,建议完善AnswerPicked的实现:
- 把
answer设为必填参数(避免空值) - 在
props中加入answer,让Equatable能正确判断状态是否变化
class AnswerPicked extends AnswerState { final String answer; // 改成required确保answer必须传入 const AnswerPicked({ required this.answer, }); @override List<Object> get props => [answer]; // 加入answer,Equatable才能正确比较状态 @override String toString() => '{AnswerPicked: $answer}'; }
这样修改后,pickAnswer方法也要对应调整:
void pickAnswer(String answer) { emit(AnswerInitial()); emit(AnswerPicked(answer: answer)); // 这里现在是必填参数,不会遗漏 }
内容的提问来源于stack exchange,提问作者Goldlightdrake
相关产品推荐
相关产品推荐

