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

Flutter如何通过POST请求获取接口数据并在ListView中展示

问题修复方案

你的代码存在两个核心错误,修改后即可正常渲染列表:


1. 修复fetchData方法缺少返回值的问题

你定义的fetchData方法声明返回Future<List<dynamic>>,但当前方法仅打印了接口数据,没有将解析好的data列表返回,导致FutureBuilder无法拿到数据,始终停留在加载状态。
在fetchData方法末尾添加return data;即可。

2. 修复JSON字段名大小写不匹配的问题

接口返回的医生字段是首字母大写的DoctorId、EncDoctorId,你编写的取值代码用了小写开头的doctorId、encDoctorId,无法匹配到对应字段,会取不到值导致报错。
修改_docId和_encDid方法里的字段名为正确的大写开头格式。


修正后的完整代码

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Http request"),
        ),
        body: const Server(),
      ),
    );
  }
}

class Server extends StatefulWidget {
  const Server({super.key});

  _ServerState createState() => _ServerState();
}

class _ServerState extends State<Server> {
  Future<List<dynamic>> fetchData() async {
    // 如果使用新版http库,需要将url包裹在Uri.parse中,如下:
    // final response = await http.post(Uri.parse("http://medbo.digitalicon.in/api/medboapi/alldoctor"));
    final response = await http.post("http://medbo.digitalicon.in/api/medboapi/alldoctor");
    Map<String, dynamic> map = json.decode(response.body);
    List<dynamic> data = map["Data"];
    print(data[0]["DoctorId"]);
    print(data[0]["EncDoctorId"]);
    print(data[0]["DoctorName"]);
    // 添加返回值
    return data;
  }

  String _docId(dynamic doc) {
    // 修正字段名大小写
    return doc['DoctorId'];
  }

  String _encDid(dynamic doc) {
    // 修正字段名大小写
    return doc['EncDoctorId'];
  }

  Widget build(BuildContext context) {
    return FutureBuilder<List<dynamic>>(
      future: fetchData(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        // 新增错误处理逻辑,避免崩溃
        if (snapshot.hasError) {
          return Center(child: Text("加载出错:${snapshot.error}"));
        }
        if (snapshot.hasData) {
          return ListView.builder(
              padding: const EdgeInsets.all(8.0),
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                return Card(
                  child: Column(
                    children: <Widget>[
                      ListTile(
                        title: Text(_docId(snapshot.data[index])),
                        subtitle: Text(_encDid(snapshot.data[index])),
                      )
                    ],
                  ),
                );
              });
        }
        return const CircularProgressIndicator();
      },
    );
  }
}

额外优化建议

  • 可以新增Doctor实体类,将Map数据转为实体类对象,避免手写字段名出现大小写、拼写错误
  • 增加接口请求状态判断,判断response.statusCode是否为200再解析数据,处理接口请求失败的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:57:01