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

Flutter中从API提取数据并在ListView展示的问题求助

解决Flutter中POST请求数据并在ListView展示的问题

1. 创建强类型数据模型

先定义对应API返回数据的模型类,避免直接操作动态类型导致的错误,同时让数据操作更清晰:

class LogItem {
  final String responsibleAdmin;
  final int date;
  final int userId;
  final int fixedId;
  final int amount;

  LogItem({
    required this.responsibleAdmin,
    required this.date,
    required this.userId,
    required this.fixedId,
    required this.amount,
  });

  // 从JSON对象转换为LogItem实例
  factory LogItem.fromJson(Map<String, dynamic> json) {
    return LogItem(
      responsibleAdmin: json['responsible_admin'],
      date: json['date'],
      userId: json['userID'],
      fixedId: json['fixedID'],
      amount: json['amount'],
    );
  }
}

2. 修正数据获取逻辑并存储数据

原代码中jsonEncode的写法存在语法错误,同时需要把返回的JSON数组转换为LogItem列表并保存到组件状态中:

class _LogListPageState extends State<LogListPage> {
  List<LogItem> _logItems = [];
  bool _isLoading = false;

  Future<void> fetchLogs() async {
    setState(() {
      _isLoading = true;
    });

    try {
      final response = await http.post(
        Uri.parse('my.api.com'),
        headers: {
          "Content-Type": "application/json"
        },
        // 修正jsonEncode的写法
        body: jsonEncode({
          "u": "admin",
          "pw": "password",
        }),
      );

      if (response.statusCode == 200) {
        final jsonResponse = jsonDecode(response.body);
        // 提取data数组并转换为LogItem列表
        List<dynamic> rawData = jsonResponse['data'];
        setState(() {
          _logItems = rawData.map((item) => LogItem.fromJson(item)).toList();
        });
      } else {
        print('请求失败,状态码:${response.statusCode}');
      }
    } catch (e) {
      print('请求出错:$e');
    } finally {
      setState(() {
        _isLoading = false;
      });
    }
  }

  @override
  void initState() {
    super.initState();
    // 页面初始化时触发数据请求
    fetchLogs();
  }

  // 构建UI部分见下一步
}

3. 用ListView展示数据

使用ListView.builder构建列表,同时处理加载状态、空数据状态,还可以把时间戳转换为可读的日期格式:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('操作日志')),
    body: _isLoading
        ? const Center(child: CircularProgressIndicator())
        : _logItems.isEmpty
            ? const Center(child: Text('暂无日志数据'))
            : ListView.builder(
                itemCount: _logItems.length,
                itemBuilder: (context, index) {
                  final log = _logItems[index];
                  // 将毫秒时间戳转换为DateTime
                  DateTime logDate = DateTime.fromMillisecondsSinceEpoch(log.date);
                  return ListTile(
                    title: Text('管理员:${log.responsibleAdmin}'),
                    subtitle: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text('用户ID:${log.userId}'),
                        Text('固定ID:${log.fixedId}'),
                        Text('金额:${log.amount}'),
                        Text('操作时间:${logDate.toString().split('.')[0]}'),
                      ],
                    ),
                  );
                },
              ),
  );
}

常见错误排查

  • 检查字段名大小写:确保模型类中的字段和API返回的JSON字段完全匹配(比如userID和fixedID的大小写)
  • 确认API返回格式:保证data字段是数组类型,且没有拼写错误
  • 网络权限:在AndroidManifest.xml或Info.plist中添加网络访问权限,避免请求失败

内容的提问来源于stack exchange,提问作者Shervin.bdn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:37:27