Flutter向Django API提交日志时触发类型转换异常求助
问题描述
我在Django项目中开发了一个接收日志的API,支持提交包含整数和字符串类型的参数。在Flutter应用中调用该API提交日志时,始终抛出异常:type 'int' is not a subtype of type 'String' in type cast。我已确认logExercise、logWorkout为字符串类型,但仍未找到问题根源,现附上相关代码寻求解决方法:
Django 后端代码(Api/views.py)
@api_view(['POST', 'GET']) @permission_classes([IsAuthenticated]) def addlog(request,username, id): workout = Workout.objects.get(id=id, user=request.user) if request.method == 'POST': if workout.active: active_session = ActiveSession.objects.get(id=ActiveSession.objects.last().id) form = LogForm(request.POST) if form.is_valid(): data = Log() data.user = request.user data.log_workout = request.POST.get('log_workout') data.log_exercise = request.POST.get('log_exercise') data.log_order = request.POST.get('log_order') data.log_repetitions = form.cleaned_data['log_repetitions'] data.log_weight = form.cleaned_data['log_weight'] data.workout_id = Workout.pk data.save()
Flutter 接口代码(api_service.dart)
static Future<http.Response> addLog(int logWeight, int logRepetitions, int logOrder, String logExercise, String logWorkout, int id) async { var url = Uri.parse(Config.apiURL + Config.userAddlogAPI.replaceFirst("{id}", id.toString())); try { final response = await http.post(url, headers: { HttpHeaders.authorizationHeader: 'Token xxxxxxxxxxxx', }, body: { 'log_weight': logWeight, 'log_repetitions': logRepetitions, 'log_order': logOrder, 'log_exercise': logExercise, 'log_workout': logWorkout, }); #.......if to catch error but it doesn't reach this part........................ }
Flutter 界面代码(screen.dart)
Form( child: Expanded( child: Column( children: [ TextFormField(keyboardType:TextInputType.number, onChanged:(value) {final int?parsedValue = int.tryParse(value); if (parsedValue !=null) {setState(() { logWeight = parsedValue;}); } else {} },), TextFormField(keyboardType:TextInputType.number, onChanged:(value) { final int?parsedValue = int.tryParse(value); if (parsedValue != null) {setState(() {logRepetitions = parsedValue;}); } else {}},), OutlinedButton(child: Text('Add Log'), onPressed: () async { final Map<String, dynamic> arguments = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>; final int id = arguments['id'] ??0; final String logWorkout = arguments['logWorkout'] ??''; final String logExercise = snapshot.data![index].name; // <-- set logExercise here final int logOrder = breakdown.order; print("$logRepetitions, $logWeight, $logOrder, $logExercise, $logWorkout, $id"); print(id.runtimeType); try { final http.Response response = await APIService.addLog( logWeight, logRepetitions, logOrder, logExercise, logWorkout, id); if (response.statusCode == 200) { print('Log submitted successfully');} else { print('Failed to submit log');} } catch (error) { print(error); await showDialog( context: context, builder: (context) { return AlertDialog(title:Text('Error'), content: Text(error.toString()), actions: [ OutlinedButton( child: Text('OK'), onPressed: () {Navigator.of(context).pop(); },),],); },); } }, ), ],),),),
Flutter端界面包含两个数字输入框和提交按钮,用户输入数值后点击提交就会触发该异常,我是Flutter新手,希望得到帮助。
问题原因与解决方法
核心原因
Flutter的http.post方法中,当body参数为Map<String, dynamic>时,若值为整数类型,框架会直接以整数格式传递数据,但Django的request.POST仅接收字符串类型的表单数据,这就导致了类型转换异常。
解决步骤
- 修改Flutter接口代码:将所有整数类型的参数转为字符串后再放入请求
body:
static Future<http.Response> addLog(int logWeight, int logRepetitions, int logOrder, String logExercise, String logWorkout, int id) async { var url = Uri.parse(Config.apiURL + Config.userAddlogAPI.replaceFirst("{id}", id.toString())); try { final response = await http.post(url, headers: { HttpHeaders.authorizationHeader: 'Token xxxxxxxxxxxx', }, body: { 'log_weight': logWeight.toString(), 'log_repetitions': logRepetitions.toString(), 'log_order': logOrder.toString(), 'log_exercise': logExercise, 'log_workout': logWorkout, }); // 后续错误处理代码 }
可选优化Django后端
当前通过form.cleaned_data获取log_repetitions和log_weight是有效的(表单会自动将字符串转为整数),但如果直接从request.POST获取整数参数,需手动转换:data.log_order = int(request.POST.get('log_order'))额外检查项
- 确保
logOrder、logWeight、logRepetitions在Flutter端为有效整数,避免传递null值 - 提交前可打印参数类型和值,确认数据正确性:
print('log_weight: 类型${logWeight.runtimeType},值$logWeight'); print('log_repetitions: 类型${logRepetitions.runtimeType},值$logRepetitions'); print('log_order: 类型${logOrder.runtimeType},值$logOrder');
- 确保
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

