Flutter for OpenHarmony前置知识《Flutter 网络请求实战:从零实现一个完整的 API 测试页面》

Flutter 网络请求实战

  • [从零实现一个完整的 API 测试页面](#从零实现一个完整的 API 测试页面)
    • [🎯 目标效果](#🎯 目标效果)
    • [🛠️ 第一步:添加依赖](#🛠️ 第一步:添加依赖)
    • [📄 第二步:编写核心代码](#📄 第二步:编写核心代码)
    • [🔍 代码详解](#🔍 代码详解)
      • [1. `http.get()` 发起请求](#1. http.get() 发起请求)
      • [2. 解析 JSON 数据](#2. 解析 JSON 数据)
      • [3. UI 状态管理](#3. UI 状态管理)
      • [4. 错误处理](#4. 错误处理)
    • [✅ 运行测试](#✅ 运行测试)
    • [🚀 进阶建议](#🚀 进阶建议)
    • [📌 总结](#📌 总结)

从零实现一个完整的 API 测试页面

在 Flutter 开发中,网络请求是连接应用与后端服务的关键环节。本文将通过一个真实可运行的示例代码,带你一步步实现一个完整的网络请求测试页面,涵盖:

  • ✅ 添加 HTTP 依赖
  • ✅ 发起 GET 请求
  • ✅ 解析 JSON 数据
  • ✅ 展示加载状态和错误处理
  • ✅ 实际运行效果展示

最终你将得到一个功能完整、用户体验良好的网络请求测试界面。


🎯 目标效果

以下是本教程实现后的实际运行效果(截图):

点击"获取文章"按钮后,会从 JSONPlaceholder 获取一篇模拟文章,并显示标题和内容。


🛠️ 第一步:添加依赖

pubspec.yaml 文件中添加 http 包:

yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.0

然后运行:

bash 复制代码
flutter pub get

💡 http 是 Flutter 官方推荐的基础网络库,轻量且易于使用。


📄 第二步:编写核心代码

将以下代码保存到 lib/main.dart 中:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '网络请求测试',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const NetworkTestPage(),
    );
  }
}

class NetworkTestPage extends StatefulWidget {
  const NetworkTestPage({super.key});

  @override
  State<NetworkTestPage> createState() => _NetworkTestPageState();
}

class _NetworkTestPageState extends State<NetworkTestPage> {
  String _responseText = '点击按钮发起请求';
  bool _isLoading = false;

  Future<void> _fetchData() async {
    setState(() {
      _isLoading = true;
      _responseText = '加载中...';
    });

    try {
      final response = await http.get(
        Uri.parse('https://jsonplaceholder.typicode.com/posts/1'),
      );

      if (response.statusCode == 200) {
        final data = jsonDecode(response.body) as Map<String, dynamic>;
        setState(() {
          _responseText = '标题: ${data['title']}\n\n内容: ${data['body']}';
        });
      } else {
        setState(() {
          _responseText = '请求失败,状态码: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        _responseText = '网络错误: $e';
      });
    } finally {
      setState(() {
        _isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('网络请求测试')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: _fetchData,
              child: const Text('获取文章'),
            ),
            const SizedBox(height: 20),
            if (_isLoading)
              const CircularProgressIndicator()
            else
              Expanded(
                child: SingleChildScrollView(
                  child: Text(_responseText),
                ),
              ),
          ],
        ),
      ),
    );
  }
}

🔍 代码详解

1. http.get() 发起请求

dart 复制代码
final response = await http.get(
  Uri.parse('https://jsonplaceholder.typicode.com/posts/1'),
);
  • 使用 Uri.parse() 构造 URL
  • await 等待异步响应
  • 返回值为 Response 对象,包含状态码和 body

2. 解析 JSON 数据

dart 复制代码
final data = jsonDecode(response.body) as Map<String, dynamic>;
  • jsonDecode() 将字符串转为 Dart 对象
  • 类型断言为 Map<String, dynamic>,便于访问字段

3. UI 状态管理

  • _isLoading 控制加载动画
  • _responseText 显示结果或错误信息
  • 使用 setState() 更新 UI

4. 错误处理

dart 复制代码
try { ... } catch (e) { ... } finally { ... }
  • try: 正常执行请求
  • catch: 捕获网络异常(如无网、超时)
  • finally: 无论成功与否,关闭加载状态

✅ 运行测试

  1. 打开dev,进入项目根目录

  2. 运行项目:

  3. 启动应用后,点击 "获取文章" 按钮

  4. 观察是否成功显示文章内容

✅ 成功标志:显示如下内容:

复制代码
标题: sunt aut facere repellat provident occaecati excepturi optio reprehenderit

内容: quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto

🚀 进阶建议

功能 推荐方案
支持 POST / PUT 使用 http.post()dio
添加 Token 认证 在 headers 中加入 Authorization
重试机制 使用 retry 库或手动循环
缓存数据 结合 shared_preferenceshive
多语言支持 使用 intl

📌 总结

通过这个简单的例子,你已经掌握了 Flutter 中最基础也最重要的技能之一:网络请求与数据展示

关键点回顾:

  • 使用 http 包发起请求
  • jsonDecode() 解析返回数据
  • FutureBuildersetState 管理异步状态
  • 做好错误处理和用户反馈

🎯 这个页面可以作为你所有 Flutter 项目的"网络测试模板",只需替换 URL 和解析逻辑即可复用。

相关推荐
克喵的水银蛇6 小时前
Flutter 布局实战:掌握 Row/Column/Flex 弹性布局
前端·javascript·flutter
YJlio6 小时前
Autologon 学习笔记(9.7):安全自动登录的正确打开方式
笔记·学习·安全
四谎真好看6 小时前
Java 黑马程序员学习笔记(进阶篇30)
java·笔记·学习·学习笔记
sunly_6 小时前
Flutter:实现多图上传选择的UI
flutter·ui
雍凉明月夜6 小时前
视觉opencv学习笔记Ⅳ
笔记·opencv·学习·计算机视觉
程序员东岸6 小时前
《数据结构——排序(下)》分治与超越:快排、归并与计数排序的终极对决
数据结构·c++·经验分享·笔记·学习·算法·排序算法
倔强_build6 小时前
flutter app 状态栏
flutter
qq_160144876 小时前
AI爱好者入门:2025年CAIE报考指南与学习路径解析
人工智能·学习
joenfoc7 小时前
新手小白动手学习大模型应用开发-搭建个人知识库
学习
lingggggaaaa7 小时前
炎魂网络 - 安全开发实习生面经
网络·学习·安全·web安全·网络安全