
1. 项目概述作为一名长期从事跨平台开发的工程师我最近在探索Flutter在鸿蒙系统上的开发实践。网络请求作为移动应用开发中最基础也最核心的功能之一是每个开发者必须掌握的技能。本文将详细介绍如何在Flutter for OpenHarmony项目中使用dio库实现网络请求并分享我在实际开发中积累的经验和技巧。对于刚接触Flutter鸿蒙开发的开发者来说配置环境和实现网络请求可能会遇到各种问题。本文将从环境准备开始逐步引导你完成整个开发流程包括项目创建、依赖配置、网络请求实现和UI渲染等关键环节。2. 环境准备与项目创建2.1 开发环境配置在开始之前确保你已经完成以下准备工作安装Android Studio这是Flutter开发的主要IDE建议下载最新稳定版配置Flutter SDK需要特别注意的是鸿蒙开发需要使用特定的Flutter分支安装必要的插件在Android Studio中安装Flutter和Dart插件提示首次安装Flutter插件后Android Studio会提示重启这是正常现象请按照提示操作。2.2 创建鸿蒙兼容的Flutter项目创建支持鸿蒙的Flutter项目需要执行特殊命令flutter create --platform ohos .这个命令会在当前目录生成一个支持OpenHarmony平台的Flutter项目结构。注意命令末尾的点(.)表示在当前目录创建项目这是很多开发者容易忽略的关键细节。2.3 项目命名规范在创建项目时Dart/Flutter对项目名称有严格规范要求只能使用小写字母、数字和下划线不能包含大写字母、连字符或空格不能以数字开头例如以下命名都是符合规范的use_dio_demodio_demomy_dio_project而像useDioDemo或use-dio-demo这样的命名会导致项目创建失败。这是新手常犯的错误我在早期开发中也踩过这个坑。3. 项目结构与配置3.1 项目目录结构一个标准的Flutter鸿蒙项目通常包含以下关键目录lib/ ├── api/ # 网络请求相关代码 ├── models/ # 数据模型 ├── pages/ # 页面组件 ├── utils/ # 工具类 └── main.dart # 应用入口这种结构化的组织方式有助于项目长期维护特别是当项目规模扩大时。3.2 添加dio依赖在pubspec.yaml文件中添加dio依赖dependencies: dio: ^5.5.01关于版本号的说明5.5.01会安装精确的5.5.0版本^5.5.0会安装5.5.0或更高但低于6.0.0的版本添加依赖后在终端运行flutter pub get命令下载依赖包。4. 实现网络请求4.1 选择API接口为了演示网络请求我们使用一个公开的猫咪图片API接口地址https://api.thecatapi.com/v1/images/search请求方式GET可选参数limit返回图片数量page页码order排序方式4.2 创建API服务类在lib/api目录下创建cat_service.dart文件import package:dio/dio.dart; class CatService { final Dio _dio Dio(); FutureListdynamic fetchCats({int limit 1}) async { try { final response await _dio.get( https://api.thecatapi.com/v1/images/search, queryParameters: {limit: limit}, ); return response.data; } catch (e) { throw Exception(Failed to load cats: $e); } } }4.3 创建数据模型在lib/models目录下创建cat_model.dart文件class Cat { final String id; final String url; final int width; final int height; Cat({ required this.id, required this.url, required this.width, required this.height, }); factory Cat.fromJson(MapString, dynamic json) { return Cat( id: json[id], url: json[url], width: json[width], height: json[height], ); } }4.4 实现UI展示在lib/pages目录下创建cat_page.dart文件import package:flutter/material.dart; import ../api/cat_service.dart; import ../models/cat_model.dart; class CatPage extends StatefulWidget { const CatPage({super.key}); override StateCatPage createState() _CatPageState(); } class _CatPageState extends StateCatPage { final CatService _catService CatService(); Cat? _currentCat; bool _isLoading false; Futurevoid _fetchCat() async { setState(() _isLoading true); try { final data await _catService.fetchCats(); if (data.isNotEmpty) { setState(() _currentCat Cat.fromJson(data[0])); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(Error: $e)), ); } finally { setState(() _isLoading false); } } override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text(猫咪图库)), body: Center( child: _isLoading ? const CircularProgressIndicator() : _currentCat null ? const Text(点击按钮获取猫咪图片) : Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.network(_currentCat!.url), const SizedBox(height: 20), Text(尺寸: ${_currentCat!.width}×${_currentCat!.height}), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _fetchCat, child: const Icon(Icons.refresh), ), ); } }5. 运行与调试5.1 鸿蒙设备运行在Android Studio中打开ohos项目确保已连接鸿蒙设备或模拟器点击运行按钮启动项目5.2 常见问题解决问题1网络请求失败可能原因设备没有网络连接鸿蒙应用没有网络权限解决方案检查设备网络连接在config.json中添加网络权限{ module: { reqPermissions: [ { name: ohos.permission.INTERNET } ] } }问题2图片加载缓慢解决方案使用cached_network_image包替代Image.network添加加载指示器和错误处理6. 性能优化与最佳实践6.1 Dio实例管理建议使用单例模式管理Dio实例避免重复创建class ApiClient { static final Dio _dio Dio(); static Dio get instance { _dio.options BaseOptions( connectTimeout: const Duration(seconds: 5), receiveTimeout: const Duration(seconds: 3), ); return _dio; } }6.2 错误处理增强为Dio添加拦截器统一处理错误_dio.interceptors.add(InterceptorsWrapper( onError: (error, handler) { if (error.response?.statusCode 401) { // 处理认证错误 } return handler.next(error); }, ));6.3 请求取消实现请求取消功能避免页面销毁后继续处理响应class _CatPageState extends StateCatPage { final CancelToken _cancelToken CancelToken(); override void dispose() { _cancelToken.cancel(); super.dispose(); } Futurevoid _fetchCat() async { try { final data await _catService.fetchCats(cancelToken: _cancelToken); // ... } on DioException catch (e) { if (e.type ! DioExceptionType.cancel) { // 处理非取消错误 } } } }7. 项目扩展建议7.1 状态管理对于更复杂的应用建议引入状态管理方案如Provider或Riverpoddependencies: provider: ^6.1.27.2 本地存储结合shared_preferences或hive实现数据缓存dependencies: shared_preferences: ^2.2.2 hive: ^2.2.37.3 更多API集成可以扩展调用更多公开API如天气API新闻API用户认证API在实际开发中我发现合理组织项目结构和使用适当的第三方库可以显著提高开发效率。特别是在鸿蒙平台上由于生态还在发展初期选择稳定可靠的库尤为重要。dio作为Flutter社区最流行的网络请求库之一在鸿蒙平台上也表现良好是跨平台开发的可靠选择。