38.Flutter 零基础入门(三十八):网络请求实战 http、dio —— 获取列表与刷新 UI

Flutter 零基础入门(三十八):网络请求实战 http / dio ------ 获取列表与刷新 UI

到目前为止,你已经掌握了:

  • 动态页面(StatefulWidget + setState)
  • 异步操作(Future / async / await)
  • 用户交互反馈(SnackBar / AlertDialog)

接下来,我们进入 真正的业务数据交互阶段

  • 获取远程数据(列表、详情)
  • 显示在 UI 上
  • 刷新列表

Flutter 提供了多种网络请求方式,最常用的是 httpdio


一、添加依赖

1️⃣ http

pubspec.yaml 添加:

yaml 复制代码
dependencies:
  http: ^1.1.0

2️⃣ dio(可选进阶)

复制代码
dependencies:
  dio: ^5.0.0

📌 这里我们先用 http 做基础示例。


二、简单 GET 请求示例(http)

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

Future<List<dynamic>> fetchPosts() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
  if (response.statusCode == 200) {
    return json.decode(response.body);
  } else {
    throw Exception('加载失败');
  }
}

📌 json.decode 将 JSON 字符串转换为 Dart List / Map


三、结合 StatefulWidget 显示列表

复制代码
class NetworkListPage extends StatefulWidget {
  @override
  _NetworkListPageState createState() => _NetworkListPageState();
}

class _NetworkListPageState extends State<NetworkListPage> {
  List<dynamic> _posts = [];
  bool _isLoading = true;

  @override
  void initState() {
    super.initState();
    loadData();
  }

  Future<void> loadData() async {
    try {
      final posts = await fetchPosts();
      setState(() {
        _posts = posts;
        _isLoading = false;
      });
    } catch (e) {
      setState(() {
        _isLoading = false;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('加载失败: $e')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('网络列表')),
      body: _isLoading
          ? Center(child: CircularProgressIndicator())
          : RefreshIndicator(
              onRefresh: loadData,
              child: ListView.builder(
                itemCount: _posts.length,
                itemBuilder: (context, index) {
                  final post = _posts[index];
                  return ListTile(
                    title: Text(post['title']),
                    subtitle: Text(post['body']),
                  );
                },
              ),
            ),
    );
  }
}

📌 功能解析:

  • initState → 页面初始化加载数据
  • CircularProgressIndicator → 加载中提示
  • RefreshIndicator → 下拉刷新
  • setState → 更新 UI

四、网络请求常见坑

❌ 忘记 await → 页面先渲染空列表

❌ 异步未 try/catch → 崩溃

❌ build 里直接 await → 页面卡死

❌ 刷新列表忘记 setState → UI 不更新

📌 建议:

  • 网络请求写在事件或 initState 中
  • 异步操作完成后通过 setState 刷新 UI
  • 异常必须捕获并提示用户

五、进阶:使用 dio

复制代码
import 'package:dio/dio.dart';

final dio = Dio();

Future<List<dynamic>> fetchPostsDio() async {
  final response = await dio.get('https://jsonplaceholder.typicode.com/posts');
  return response.data;
}

📌 dio 功能更丰富:拦截器、请求取消、下载进度、FormData 上传


六、列表刷新与异步结合

使用 RefreshIndicator 包裹 ListView:

复制代码
RefreshIndicator(
  onRefresh: loadData,
  child: ListView.builder(
    itemCount: _posts.length,
    itemBuilder: (context, index) {
      final post = _posts[index];
      return ListTile(title: Text(post['title']));
    },
  ),
)

📌 下拉即可刷新网络数据 → 真实 App 必备功能


七、本篇你真正掌握了什么?

你已经学会:

  • Flutter http 请求基本用法
  • 异步获取网络数据
  • 列表展示远程数据
  • 下拉刷新与错误处理
  • dio 进阶网络请求能力

📌 到这里为止:

你已经可以写出一个"数据动态加载的列表页面"


八、一句话总结

Future / async / await 获取数据
setState 刷新 UI
RefreshIndicator + ListView 展示内容


🔜 下一篇预告

《Flutter 零基础入门(三十九):Pull-to-Refresh 与列表分页 ------ 完整列表交互实战》

下一篇我们将学习:

  • 下拉刷新
  • 上拉加载更多(分页)
  • 列表分页结合网络请求
  • 更完整的列表交互体验

🚀 实现真实业务列表的完整交互

相关推荐
●VON3 分钟前
AtomGit Flutter鸿蒙客户端:鸿蒙平台集成
flutter·华为·跨平台·harmonyos·鸿蒙
天启HTTP5 分钟前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php
丑过三八线9 分钟前
Runc 深度解析:从原理到实操
java·linux·开发语言·docker·容器·rpc
卡布鲁11 分钟前
Webpack 核心原理与自定义 Loader/Plugin 实战
前端·javascript
STDD11 分钟前
ntfy 自托管推送通知服务搭建:一条 curl 命令向手机发送通知
java·开发语言·智能手机
小林ixn13 分钟前
从拼多多手机号验证到模板引擎:深入正则表达式与 JS 字符串处理
开发语言·javascript·正则表达式
智码看视界17 分钟前
Web Storage 的无障碍实践与工程化应用
前端·javascript·web
孟陬19 分钟前
国外技术周刊 #140:在 Jeff Bezos 的私密 Campfire 峰会上,我学到了关于亿万富翁的事
前端·后端
周末也要写八哥20 分钟前
线程的生命周期之线程睡眠
java·开发语言·jvm