未处理异常:Future<dynamic>不是FutureOr<QuizResultModel?>的子类型
解决Flutter中
Future<dynamic>与FutureOr<QuizResultModel?>类型不匹配异常 问题根源
异常产生的核心原因是saveAnswerFetchResult函数声明返回Future<dynamic>,但你在赋值时试图将其强制转换为FutureOr<QuizResultModel?>,动态类型无法直接安全转换为指定的泛型Future类型,导致类型转换失败。
修复步骤
1. 修正函数返回类型
将saveAnswerFetchResult的返回类型从Future<dynamic>改为Future<QuizResultModel?>,让编译器直接做类型校验,彻底避免动态类型带来的转换问题:
Future<QuizResultModel?> saveAnswerFetchResult( String? testPaperId, String? programId, List<Map<String, dynamic>> answer, String? paperAttemptId, ) async { QuizResultModel? quizResultModel; try { Map<String, dynamic> requestedData = { "action": actionforquizsavefetchresult, "answers": answer, "testPaper": testPaperId, "program": programId, "paper_attempt": paperAttemptId, }; // 补充你的网络请求与解析逻辑(示例) // final response = await http.post(Uri.parse(yourApiUrl), body: requestedData); // final responseMap = jsonDecode(response.body); // quizResultModel = QuizResultModel.formMap(responseMap); } catch (e) { // 异常处理,确保出错时也返回合法的QuizResultModel?类型 print(e); return null; } return quizResultModel; }
2. 简化赋值代码,移除不必要的类型转换
函数返回类型明确后,直接await调用即可,无需强制类型转换:
quizResultModel = await QuizService().saveAnswerFetchResult( widget.testPaperDetailsModel!.id, widget.packageId, answer, paperAttempt );
3. 完善QuizResultModel.formMap工厂方法
当前工厂方法仅初始化了部分字段,需确保所有字段都能从接口返回值中正确解析,避免后续使用模型时出现空值或逻辑错误:
factory QuizResultModel.formMap(Map<String, dynamic> map) { return QuizResultModel( correctAnswers: map["correct_answers"]?.toString() ?? "0", totalQuestions: map["total_questions"]?.toString() ?? "0", isPass: map["is_pass"] ?? false, isTimeUp: map["is_time_up"] ?? false, skipped: map["skipped"]?.toString() ?? "0", timeSpend: map["time_spend"]?.toString() ?? "0", marksArchived: map["marks_archived"]?.toString() ?? "0", testType: map["test_type"], totalMarks: map["total_marks"]?.toString() ?? "0", message: map["message"], ); }
内容的提问来源于stack exchange,提问作者Pranav Tyagi
相关产品推荐
相关产品推荐

