从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
相关产品推荐
相关产品推荐

