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

如何从API获取数据存入SQLite并在ListView展示?Dio请求报错求助

Dio请求错误排查及代码修正

结合你的代码和常见Dio请求失败场景,直接列出问题点和解决方法:

1. 网络权限与HTTP请求限制

  • Android:在android/app/src/main/AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • iOS:在ios/Runner/Info.plist中添加允许HTTP请求的配置(你用的是http协议,iOS默认阻止非HTTPS请求):
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

2. Dio实例使用问题

你每次请求都新建Dio()实例,建议复用配置好的单例,避免重复初始化导致异常:

final dio = Dio(); // 全局或类内单例

3. 数据处理逻辑错误

  • map回调里只执行插入数据库操作,未返回Employee对象,导致最终返回的列表全为null
  • else分支直接返回response.data,与方法声明的List<Employee?>类型不匹配,会触发类型错误
  • 缺少错误捕获,网络请求可能抛出DioException,需捕获处理

修正后的完整代码

import 'package:bloggggg/employee_model.dart';
import 'package:bloggggg/db_provider.dart';
import 'package:dio/dio.dart';

class EmployeeApiProvider {
  final Dio _dio = Dio(); // 复用Dio实例

  Future<List<Employee?>> getAllEmployees() async {
    final url = "http://demo8161595.mockable.io/employee";
    try {
      Response response = await _dio.get(url);

      if (response.statusCode == 200) {
        return (response.data as List).map((employeeJson) {
          final employee = Employee.fromJson(employeeJson);
          print('Inserting $employee');
          DBProvider.db.createEmployee(employee);
          return employee; // 返回Employee对象,保证列表类型正确
        }).toList();
      } else {
        throw Exception("请求失败,状态码:${response.statusCode}");
      }
    } on DioException catch (e) {
      // 捕获Dio相关错误,比如网络异常、超时、404等
      print("Dio请求错误:${e.message}");
      return []; // 或根据需求抛出异常
    } catch (e) {
      // 捕获其他未知错误
      print("未知错误:$e");
      return [];
    }
  }
}

额外排查点

  • 确认Employee.fromJson方法能正确解析API返回的JSON结构,避免解析错误
  • 检查SQLite的createEmployee方法是否正确执行插入,确保数据库已完成初始化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:10:36