如何从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对象,导致最终返回的列表全为nullelse分支直接返回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
相关产品推荐
相关产品推荐

