You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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仅接收字符串类型的表单数据,这就导致了类型转换异常。

解决步骤

  1. 修改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,
      });
     // 后续错误处理代码
  }
  1. 可选优化Django后端
    当前通过form.cleaned_data获取log_repetitions和log_weight是有效的(表单会自动将字符串转为整数),但如果直接从request.POST获取整数参数,需手动转换:

    data.log_order = int(request.POST.get('log_order'))
    
  2. 额外检查项

    • 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:10:41