当前位置: 首页 > news >正文

flutter dio网络请求与json数据解析

在Flutter中,Dio 是一个功能强大且易于使用的网络请求库,用于处理HTTP请求和响应。与 http 包相比,Dio 提供了更多高级功能,例如拦截器、文件上传/下载、请求取消等。结合 json_serializable 或手动解析 JSON 数据,可以轻松实现网络数据的获取与解析。

以下是一个完整的示例,展示如何使用 Dio 进行网络请求并解析 JSON 数据:


1. 添加依赖

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.0.0 # 确保使用最新版本
  json_annotation: ^4.8.0

dev_dependencies:
  build_runner: ^2.3.0
  json_serializable: ^6.7.0

然后运行以下命令以安装依赖:

flutter pub get

2. 创建数据模型

为了更方便地解析 JSON 数据,我们可以创建一个数据模型类,并使用 json_serializable 自动生成序列化和反序列化代码。

定义模型类

创建一个文件 user_model.dart

import 'package:json_annotation/json_annotation.dart';

part 'user_model.g.dart'; // 自动生成的部分

()
class User {
  final int id;
  final String name;
  final String email;

  User({required this.id, required this.name, required this.email});

  // 工厂方法用于从 JSON 转换为对象
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 方法用于将对象转换为 JSON
  Map<String, dynamic> toJson() => _$UserToJson(this);
}
生成代码

运行以下命令以生成 user_model.g.dart 文件:

flutter pub run build_runner build

这会自动生成 _$UserFromJson_$UserToJson 方法。


3. 使用 Dio 发起网络请求

接下来,我们使用 Dio 发起一个 GET 请求,并将返回的 JSON 数据解析为 User 对象。

示例代码

创建一个文件 dio_example.dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'user_model.dart'; // 导入模型类

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Dio 网络请求示例')),
        body: const Center(child: UserList()),
      ),
    );
  }
}

class UserList extends StatefulWidget {
  const UserList({Key? key}) : super(key: key);

  
  _UserListState createState() => _UserListState();
}

class _UserListState extends State<UserList> {
  final Dio dio = Dio();
  List<User> users = [];

  Future<void> fetchUsers() async {
    try {
      // 示例 API 地址(假设返回 JSON 数据)
      const url = 'https://jsonplaceholder.typicode.com/users';

      // 发起 GET 请求
      final response = await dio.get(url);

      // 检查状态码是否成功
      if (response.statusCode == 200) {
        // 解析 JSON 数据
        final jsonData = response.data as List<dynamic>;

        // 将 JSON 数据转换为 User 对象列表
        setState(() {
          users = jsonData.map((json) => User.fromJson(json)).toList();
        });
      } else {
        throw Exception('Failed to load users');
      }
    } catch (e) {
      // 处理错误
      print('Error: $e');
    }
  }

  
  void initState() {
    super.initState();
    fetchUsers(); // 页面加载时自动发起请求
  }

  
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: users.length,
      itemBuilder: (context, index) {
        final user = users[index];
        return ListTile(
          title: Text(user.name),
          subtitle: Text(user.email),
        );
      },
    );
  }
}

4. 代码说明

  1. Dio 初始化

    • Dio 是一个强大的 HTTP 客户端,默认支持 GET、POST、PUT、DELETE 等 HTTP 方法。
    • 在示例中,我们通过 dio.get(url) 发起了一个 GET 请求。
  2. JSON 数据解析

    • 假设 API 返回的 JSON 数据是数组形式(如 [{...}, {...}]),我们将其解析为 List<dynamic>
    • 使用 map 方法将每个 JSON 对象转换为 User 对象。
  3. 错误处理

    • 使用 try-catch 捕获网络请求中的异常。
    • 如果状态码不是 200,抛出自定义异常。
  4. UI 更新

    • 使用 setState 更新 users 列表,触发 UI 重新渲染。

5. 测试与运行

运行项目后,应用会从 https://jsonplaceholder.typicode.com/users 获取用户数据,并将其显示在一个列表中。


6. 可选优化

  • 拦截器:可以使用 Dio 的拦截器来统一处理请求头、日志记录等。
  • 分页加载:如果数据量较大,可以实现分页加载功能。
  • 缓存机制:结合本地数据库或内存缓存,减少重复请求。

相关文章:

  • P8720 [蓝桥杯 2020 省 B2] 平面切分
  • 深度学习环境安装
  • [蓝桥杯 2017 省 B] k 倍区间
  • Unity检索一个物体下所有的子物体,只打印激活的物体
  • 【8】搭建k8s集群系列(二进制部署)之安装work-node节点组件(kubelet)
  • 实操(不可重入函数、volatile、SIGCHLD、线程)Linux
  • 从奖励到最优决策:动作价值函数与价值学习
  • UNet 改进(2):深入解析带有坐标注意力机制(CA)的UNet网络
  • go垃圾回收机制
  • Java全栈面试宝典:锁机制与Spring生命周期深度解析
  • edge webview2 runtime跟Edge浏览器软件安装包双击无反应解决方法
  • 探秘JVM内部
  • 流浪动物救助|基于Springboot+vue的流浪动物救助平台设计与实现(源码+数据库+文档)
  • 如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本
  • 论伺服电机在轨道式巡检机器人中的优势及应用实践​
  • 《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版
  • AIDD-深度学习 MetDeeCINE 破译代谢调控机制
  • 达芬奇预设:复古16mm胶片质感老式电影放映机转场过渡+音效
  • 《C++后端开发最全面试题-从入门到Offer》目录
  • WEB安全--XSS--XSS基础
  • 国外做海报的网站/不受限制的搜索浏览器
  • 什么网站做装修的/活动推广方式
  • wordpress建站 百度网盘/百度快照关键词推广
  • wordpress调用分类文章排序/seo资料站
  • 运营公开网是什么网站/t和p在一起怎么做网站
  • 国外室内设计网站大全网站/企业网站设计与实现论文