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

从000webhost的PHP页面拉取数据的Flutter Dart代码失效求助

问题排查与解决方案

1. 修正HTTPS请求配置

000webhost免费版默认可能未配置有效SSL证书,你代码里用Uri.https发起请求会直接失败。换成Uri.http试试:

final url = Uri.http(_baseURL, 'popMovies.php');

2. 加日志定位核心问题

在代码里插入日志,明确请求是否发送、响应内容、解析过程哪里出问题:

Future<void> fetchPopMovies(Function(bool success) update) async {
  try {
    final url = Uri.http(_baseURL, 'popMovies.php');
    print('请求地址:$url');
    final response = await http.get(url).timeout(const Duration(seconds: 5));
    
    print('响应状态码:${response.statusCode}');
    print('响应原始内容:${response.body}');

    if (response.statusCode == 200) {
      try {
        final List<dynamic> jsonResponse = convert.jsonDecode(response.body);
        print('解析后的JSON数据:$jsonResponse');
        for (var jsonMovie in jsonResponse) {
          final movie = Movie(
            name: jsonMovie['name'] ?? '',
            box: jsonMovie['box'] ?? '',
            cover: jsonMovie['cover'] ?? '',
            description: jsonMovie['description'] ?? '',
            platforms: (jsonMovie['platforms'] as List<dynamic>?)
                    ?.map((platform) => platform.toString())
                    .toList() ??
                [],
            rating: (jsonMovie['rating'] as num?)?.toDouble() ?? 0,
            screenshots: (jsonMovie['screenshots'] as List<dynamic>?)
                    ?.map((screenshot) => screenshot.toString())
                    .toList() ??
                [],
          );
          print('解析出的电影:${movie.name}');
          popMovies.add(movie);
        }
        print('最终列表长度:${popMovies.length}');
        update(true);
      } catch (e) {
        print('JSON解析失败:$e');
        update(false);
      }
    } else {
      print('请求失败,状态码非200');
      update(false);
    }
  } catch (e) {
    print('请求异常(超时/无网络等):$e');
    update(false);
  }
}

看日志就能直接定位是请求没发出去、响应不是标准JSON,还是解析环节报错。

3. 确保PHP返回纯标准JSON

检查你的PHP代码,必须只输出JSON字符串,不能有多余的注释、var_dump/print_r调试内容,否则会导致JSON解析失败。正确的PHP输出写法:

header('Content-Type: application/json');
echo json_encode($movieDataArray);
exit;

4. 处理Web端跨域问题

如果是Flutter Web项目,需要在PHP开头加跨域允许配置:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET");
header("Access-Control-Allow-Headers: Content-Type");

5. 确认UI刷新逻辑

检查update(true)调用后是否正确触发了Flutter状态更新,比如在StatefulWidget里调用时,update要包含setState:

fetchPopMovies((success) {
  setState(() {});
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:03:12