一周掌握Flutter开发--5、网络请求

devtools/2025/3/3 23:57:08/
http://www.w3.org/2000/svg" style="display: none;">

https://i-blog.csdnimg.cn/img_convert/1aab26c143a3c682a27bb2de0c2ad8bf.jpeg" alt="在这里插入图片描述" />

文章目录

      • 5. 网络请求
      • 核心库
      • 必须掌握
        • 5.3 GET/POST 请求
        • 5.4 JSON 序列化与反序列化(`json_serializable`)
        • 5.5 错误处理与加载状态管理
      • 总结

5. 网络请求

网络请求是移动应用开发中不可或缺的一部分,Flutter 提供了多种方式来实现网络请求。掌握网络请求的核心库和技巧,可以帮助你高效地与后端 API 交互。


核心库

http_10">5.1 http
  • 特点:Flutter 官方提供的轻量级网络请求库。
  • 安装
    dependencies:http: ^0.13.3
    
dio_18">5.2 dio
  • 特点:功能强大的第三方网络请求库,支持拦截器、文件上传、请求取消等高级功能。
  • 安装
    dependencies:dio: ^4.0.0
    

必须掌握

5.3 GET/POST 请求
  • 使用 http

    import 'package:http/http.dart' as http;// GET 请求
    Future<void> fetchData() async {final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));if (response.statusCode == 200) {print('Response data: ${response.body}');} else {print('Request failed with status: ${response.statusCode}');}
    }// POST 请求
    Future<void> postData() async {final response = await http.post(Uri.parse('https://jsonplaceholder.typicode.com/posts'),body: {'title': 'foo', 'body': 'bar', 'userId': '1'},);if (response.statusCode == 201) {print('Response data: ${response.body}');} else {print('Request failed with status: ${response.statusCode}');}
    }
    
  • 使用 dio

    import 'package:dio/dio.dart';final dio = Dio();// GET 请求
    Future<void> fetchData() async {final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');if (response.statusCode == 200) {print('Response data: ${response.data}');} else {print('Request failed with status: ${response.statusCode}');}
    }// POST 请求
    Future<void> postData() async {final response = await dio.post('https://jsonplaceholder.typicode.com/posts',data: {'title': 'foo', 'body': 'bar', 'userId': '1'},);if (response.statusCode == 201) {print('Response data: ${response.data}');} else {print('Request failed with status: ${response.statusCode}');}
    }
    

serializable_91">5.4 JSON 序列化与反序列化(json_serializable
  • 手动序列化

    class Post {final int userId;final int id;final String title;final String body;Post({required this.userId, required this.id, required this.title, required this.body});factory Post.fromJson(Map<String, dynamic> json) {return Post(userId: json['userId'],id: json['id'],title: json['title'],body: json['body'],);}Map<String, dynamic> toJson() {return {'userId': userId,'id': id,'title': title,'body': body,};}
    }
    
  • 使用 json_serializable

    1. 添加依赖

      dependencies:json_annotation: ^4.4.0dev_dependencies:build_runner: ^2.1.4json_serializable: ^6.1.4
      
    2. 定义模型类

      import 'package:json_annotation/json_annotation.dart';part 'post.g.dart';()
      class Post {final int userId;final int id;final String title;final String body;Post({required this.userId, required this.id, required this.title, required this.body});factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json);Map<String, dynamic> toJson() => _$PostToJson(this);
      }
      
    3. 生成代码
      运行以下命令生成序列化代码:

      flutter pub run build_runner build
      
    4. 使用模型类

      Future<Post> fetchPost() async {final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));if (response.statusCode == 200) {return Post.fromJson(jsonDecode(response.body));} else {throw Exception('Failed to load post');}
      }
      

5.5 错误处理与加载状态管理
  • 错误处理

    Future<void> fetchData() async {try {final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');if (response.statusCode == 200) {print('Response data: ${response.data}');} else {throw Exception('Request failed with status: ${response.statusCode}');}} catch (e) {print('Error: $e');}
    }
    
  • 加载状态管理

    class DataProvider with ChangeNotifier {bool isLoading = false;String data = '';Future<void> fetchData() async {isLoading = true;notifyListeners();try {final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));if (response.statusCode == 200) {data = response.body;} else {throw Exception('Request failed with status: ${response.statusCode}');}} catch (e) {print('Error: $e');} finally {isLoading = false;notifyListeners();}}
    }
    

总结

  • 核心库httpdio 是 Flutter 中最常用的网络请求库。
  • GET/POST 请求:掌握基本的请求方法。
  • JSON 序列化与反序列化:使用 json_serializable 简化 JSON 处理。
  • 错误处理与加载状态管理:确保应用的健壮性和用户体验。

掌握这些网络请求的核心技能后,你可以轻松实现与后端 API 的交互,并处理复杂的业务逻辑。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!


http://www.ppmy.cn/devtools/164315.html

相关文章

智能AI替代专家系统(ES)、决策支持系统(DSS)?

文章目录 前言一、专家系统&#xff08;ES&#xff09;是什么&#xff1f;二、决策支持系统&#xff08;DSS&#xff09;是什么&#xff1f;1.决策支持系统定义2.决策系统的功能与特点3.决策支持系统的组成 三、专家系统&#xff08;ES&#xff09;与决策支持系统&#xff08;D…

Java—初始多线程

多线程的理解 进程&#xff1a; 进程是程序的基本执行实体 每一个运行的软件都是一个进程 线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 简单理解&#xff1a;应用软件中互相独立&#xff0c;可以…

SQL 基础 BETWEEN 的常见用法

在SQL中&#xff0c;BETWEEN是一个操作符&#xff0c;用于选取介于两个值之间的数据。 它包含这两个边界值。BETWEEN操作符常用于WHERE子句中&#xff0c;以便选取某个范围内的值。 以下是BETWEEN的一些常见用法&#xff1a; 选取介于两个值之间的值&#xff1a; 使用 BETWE…

华为OD机试真题:租车骑绿道(E卷、C++)

华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入描述 第一行两个数字m、n,自行车限重…

Redis和MySQL的实时数据同步方案

针对 Redis 和 MySQL 的实时数据同步&#xff0c;需根据业务场景选择不同的技术方案&#xff0c;核心目标是保障数据一致性、降低延迟、提升系统可靠性。以下是几种典型方案及其适用场景&#xff1a; 方案一&#xff1a;基于 MySQL Binlog 的异步同步 原理 监听 MySQL 的 Bin…

定义数组存储3部汽车对象(class1)

package test3; public class car {/*定义数组存储3部汽车对象汽车属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色创建三个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存入数组中*/static String brond;double price;String color;public car() {}p…

机器学习:线性回归,梯度下降,多元线性回归

线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式 多元线性回归&#xff08;Multiple Linear Regression&#xff09;

前端存储方案全面对比:localStorage、sessionStorage、cookies与IndexedDB

引言 在前端开发中&#xff0c;数据存储是一个常见需求。无论是用户偏好设置、表单数据暂存、还是应用状态维护&#xff0c;我们都需要在客户端保存一定的数据。浏览器提供了多种存储方案&#xff0c;每种都有其独特的特性和适用场景。本文将全面对比四种主要的浏览器存储技术&…