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

Dart代码报错:Expected an identifier与Expected to find ')' 求解

问题分析与代码修正

你的代码存在几个核心语法和逻辑错误,直接导致了Expected an identifier、Expected to find ')'这类报错,下面逐一说明并给出修正方案:

核心错误点

  • if语句位置完全错误:你把状态码判断的if块直接嵌套在http.post()的参数列表里,这不符合Dart语法——http.post()仅接收请求配置参数(URL、headers、body等),响应处理逻辑必须在await获取请求响应之后编写。
  • body参数格式错误:jsonEncode返回的是字符串,不需要用大括号包裹;另外你使用了未定义的busCode,应该替换为函数传入的参数query。
  • 返回值与逻辑冲突:函数声明返回Future<http.Response>,但内部直接调用setState(仅StatefulWidget可用),逻辑矛盾;同时setState的括号多了多余逗号。

修正后的代码(两种常见场景)

场景1:直接在请求函数内更新UI

如果你的目标是调用接口后直接更新页面状态,函数不需要返回http.Response,改为无返回值的Future:

import 'dart:convert';
import 'package:http/http.dart' as http;
// 注意:这段代码需要放在StatefulWidget的State类中,才能使用setState

Future<void> fetchData(String query) async {
  // 1. 发送POST请求,await等待响应返回
  final response = await http.post(
    Uri.parse('https://laravelsyd-fypfinalver.herokuapp.com/getBusService'),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    // 修正body:直接传入jsonEncode后的字符串,用query替代未定义的busCode
    body: jsonEncode({'bus_stop_id': query}),
  );

  // 2. 获取响应后再执行状态码判断
  if (response.statusCode == 200) {
    final List<dynamic> data = json.decode(response.body);
    final List<Map<String, dynamic>> newDataList = List<Map<String, dynamic>>.from(data);
    // 更新页面状态
    setState(() {
      dataList = newDataList;
    });
  } else {
    print('请求失败,状态码:${response.statusCode}');
  }
}

场景2:请求逻辑与UI更新分离

如果想把请求逻辑和UI更新解耦,可以让函数返回处理后的数据,在调用处再执行setState:

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<Map<String, dynamic>>?> fetchData(String query) async {
  final response = await http.post(
    Uri.parse('https://laravelsyd-fypfinalver.herokuapp.com/getBusService'),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode({'bus_stop_id': query}),
  );

  if (response.statusCode == 200) {
    final List<dynamic> data = json.decode(response.body);
    return List<Map<String, dynamic>>.from(data);
  } else {
    print('请求失败,状态码:${response.statusCode}');
    return null;
  }
}

// 在State类中调用的示例
void loadBusData() async {
  final result = await fetchData('你的公交站ID');
  if (result != null) {
    setState(() {
      dataList = result;
    });
  }
}

关于是否需要新建类

不是必须,但如果接口返回的数据结构复杂,或者想避免Map<String, dynamic>的类型不安全问题,可以新建实体类来解析数据:

class BusService {
  final String id;
  final String serviceName;
  // 根据接口返回的实际字段定义属性

  BusService({required this.id, required this.serviceName});

  // 从JSON Map转成实体类
  factory BusService.fromJson(Map<String, dynamic> json) {
    return BusService(
      id: json['id'],
      serviceName: json['service_name'],
    );
  }
}

之后解析数据时可以用这个类:

final List<BusService> busServices = data.map((item) => BusService.fromJson(item)).toList();

内容的提问来源于stack exchange,提问作者katamykenji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:23