

在 Flutter 开发中,网络请求是连接应用与后端服务的关键环节。本文将通过一个真实可运行的示例代码,带你一步步实现一个完整的网络请求测试页面,涵盖:
最终你将得到一个功能完整、用户体验良好的网络请求测试界面。
以下是本教程实现后的实际运行效果(截图):

点击“获取文章”按钮后,会从 JSONPlaceholder 获取一篇模拟文章,并显示标题和内容。
在 pubspec.yaml 文件中添加 http 包:
dependencies:
flutter:
sdk: flutter
http: ^1.2.0然后运行:
flutter pub get
💡
http是 Flutter 官方推荐的基础网络库,轻量且易于使用。
将以下代码保存到 lib/main.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),
),
),
],
),
),
);
}
}http.get() 发起请求final response = await http.get(
Uri.parse('https://jsonplaceholder.typicode.com/posts/1'),
);Uri.parse() 构造 URLawait 等待异步响应Response 对象,包含状态码和 bodyfinal data = jsonDecode(response.body) as Map<String, dynamic>;jsonDecode() 将字符串转为 Dart 对象Map<String, dynamic>,便于访问字段_isLoading 控制加载动画_responseText 显示结果或错误信息setState() 更新 UItry { ... } catch (e) { ... } finally { ... }try: 正常执行请求catch: 捕获网络异常(如无网、超时)finally: 无论成功与否,关闭加载状态✅ 成功标志:显示如下内容:
标题: 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_preferences 或 hive |
多语言支持 | 使用 intl 包 |
通过这个简单的例子,你已经掌握了 Flutter 中最基础也最重要的技能之一:网络请求与数据展示。
关键点回顾:
http 包发起请求jsonDecode() 解析返回数据FutureBuilder 或 setState 管理异步状态🎯 这个页面可以作为你所有 Flutter 项目的“网络测试模板”,只需替换 URL 和解析逻辑即可复用。