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

Flutter中API请求成功但列表视图不显示数据问题排查

Flutter API请求成功但列表无数据显示问题修复

问题现象

首次开发Flutter应用,调用获取图书馆占用率的API时,终端能打印数据,但设备屏幕显示空白,无加载指示器,同时抛出FormatException错误。

核心错误分析

从日志和代码中可定位三个关键问题:

  1. API服务返回数据错误:remote_service.dart中getPosts方法仅返回单个图书馆的occupancy字符串(如.0000),而非完整的API响应JSON,导致后续调用librariesFromJson解析完整模型时失败。
  2. 加载状态判断失效:HomePage中_libraries初始化为空列表[],而非null,因此_libraries == null永远为false,加载指示器CircularProgressIndicator从未触发,直接显示长度为0的空列表。
  3. 数据类型不匹配:API返回的是单个Libraries对象(包含三个图书馆数据),但HomePage中用List<Libraries>存储,类型不匹配导致无法正确渲染。

修复步骤

1. 修正API服务,返回完整数据

修改remote_service.dart,让getPosts返回解析好的Libraries对象,而非单个字符串:

// ignore_for_file: camel_case_types
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:xconcordia/models/post.dart';

class getDataAPI {
  Future<Libraries?> getPosts() async {
    var credentials = '520:276377ba5206683e51d50fb86c378dc5';
    var base64Credentials = base64Encode(utf8.encode(credentials));

    var headers = {'Authorization': 'Basic $base64Credentials'};

    var request = http.Request('GET',
        Uri.parse('https://opendata.concordia.ca/API/v1/library/occupancy/'));
    request.headers.addAll(headers);

    http.StreamedResponse response = await request.send();

    if (response.statusCode == 200) {
      String jsonStr = await response.stream.bytesToString();
      Libraries library = librariesFromJson(jsonStr);
      print("webster: " + library.webster.occupancy);
      return library;
    } else {
      print(response.statusCode);
      return null;
    }
  }
}

2. 修正HomePage的状态管理与列表渲染

将_libraries改为可空的Libraries?类型,修复加载状态判断,并将单个Libraries对象中的三个图书馆转为列表渲染:

import 'package:flutter/material.dart';

import '../models/post.dart';
import '../services/remote_service.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Libraries? _libraryData;

  @override
  void initState() {
    super.initState();
    _getPosts();
  }

  void _getPosts() async {
    var api = getDataAPI();
    var libraryData = await api.getPosts();
    setState(() {
      _libraryData = libraryData;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Library Occupancy'),
      ),
      body: _libraryData == null
          ? const Center(
              child: CircularProgressIndicator(),
            )
          : ListView(
              children: [
                ListTile(
                  title: const Text('Webster Library'),
                  subtitle: Text('Occupancy: ${_libraryData!.webster.occupancy}'),
                  trailing: Text('Updated: ${_libraryData!.webster.lastRecordTime.toString().split(' ')[0]}'),
                ),
                ListTile(
                  title: const Text('Vanier Library'),
                  subtitle: Text('Occupancy: ${_libraryData!.vanier.occupancy}'),
                  trailing: Text('Updated: ${_libraryData!.vanier.lastRecordTime.toString().split(' ')[0]}'),
                ),
                ListTile(
                  title: const Text('GreyNuns Library'),
                  subtitle: Text('Occupancy: ${_libraryData!.greyNuns.occupancy}'),
                  trailing: Text('Updated: ${_libraryData!.greyNuns.lastRecordTime.toString().split(' ')[0]}'),
                ),
              ],
            ),
    );
  }
}

3. 修正数据模型中的异步错误

移除remote_service.dart中多余的await(librariesFromJson是同步方法,不需要await),原代码中的// ignore: await_only_futures注释也可删除。

修复后效果

  • 加载过程中显示圆形加载指示器
  • API数据返回后,正确展示三个图书馆的名称、占用率和更新时间
  • 不再抛出FormatException错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:55:16