使用Multipart请求作为Http body参数获API成功响应后如何跳转下一个Material页面
问题解决方案
报错根因
你的报错完全是因为jsonResponse变量没有被赋值,全程都是null:
- 你发送请求后拿到的是
StreamedResponse类型的响应对象,没有把响应内容读取解析成JSON并赋值给jsonResponse - 直接把null传入
DieticianEncBookingIdModel.fromJson方法,方法内部尝试读取["Status"]字段时就触发了空指针错误 - 额外还有一个参数传值错误:你给请求字段赋值时加了多余的单引号,把变量写成了字符串常量,会导致传给后端的参数完全不对
修改后完整代码
首先确认你已经导入了必要依赖:
import 'dart:convert'; import 'package:http/http.dart' as http;
修改SaveCustomTestBooking方法如下:
Future<void> SaveCustomTestBooking() async { var jsonResponse; if (EncUserId.isNotEmpty) { var postUri = Uri.parse("http://mkklklklklktBooking"); var request = http.MultipartRequest('POST',postUri); // 去掉多余的单引号,传入实际变量值 request.fields['VisitDate'] = _selectedDate; request.fields['EncUserId'] = EncUserId; request.files.add(http.MultipartFile.fromBytes( "UserFile", File(image!.path).readAsBytesSync(), filename:"Image.jpg", contentType: MediaType('image', 'jpg') )); // 改用await写法避免异步嵌套,逻辑更清晰 final response = await request.send(); if (response.statusCode == 200) { print("Uploaded!"); // 读取响应流内容,解析为JSON赋值给jsonResponse final respStr = await response.stream.bytesToString(); jsonResponse = jsonDecode(respStr); // 增加mounted判断,防止页面销毁后context失效报错 if(mounted) { Navigator.push(context, MaterialPageRoute( builder: (context) => DieticianAfterDateSelectPage( rresponse: DieticianEncBookingIdModel.fromJson(jsonResponse) ) )); } } else { if(mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Something went wrong")) ); } throw Exception("Failed to fetch"); } } }
其他注意事项
- 建议给
DieticianEncBookingIdModel.fromJson方法增加空安全判断,避免后端返回字段缺失时再次触发空指针 - 如果你的后端返回的不是标准JSON格式,需要根据实际返回格式调整解析逻辑
- 上传大尺寸图片建议改用异步读取方式,避免阻塞UI线程
内容的提问来源于stack exchange,提问作者Toujo
相关产品推荐
相关产品推荐

