Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存

简介: 本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。

写在前面
在现代应用中,处理用户身份验证和缓存是非常重要的。Dio 是一个强大的 Dart HTTP 客户端,支持多种功能,例如请求拦截、响应拦截等。本文将详细讲解如何在 Flutter 中使用 Dio 封装网络请求,并实现登录身份验证及免登录缓存功能。

一、引入 Dio
首先,在 pubspec.yaml 文件中添加 Dio 依赖:

dependencies:
dio: ^5.0.0
shared_preferences: ^2.0.0
运行 flutter pub get 命令安装依赖。

二、创建 Dio 封装类
在 lib/services 目录下新建 network_service.dart 文件,编写以下代码以封装 Dio 功能:

import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';

class NetworkService {
late Dio _dio;
static const String _tokenKey = 'auth_token';

NetworkService() {
_dio = Dio(BaseOptions(
baseUrl: 'https://api.example.com/', // 替换为你的 API 基础 URL
connectTimeout: 5000,
receiveTimeout: 3000,
));

// 添加拦截器
_dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) async {
    final token = await _getToken();
    if (token != null) {
      options.headers['Authorization'] = 'Bearer $token'; // 添加 Token 到请求头
    }
    print('请求: ${options.method} ${options.path}');
    handler.next(options);
  },
  onResponse: (response, handler) {
    print('响应: ${response.statusCode} ${response.data}');
    handler.next(response);
  },
  onError: (DioError e, handler) {
    print('错误: ${e.response?.statusCode} ${e.message}');
    handler.next(e);
  },
));

}

// 获取 Token
Future _getToken() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString(_tokenKey);
}

// 登录请求
Future login(String username, String password) async {
final response = await _dio.post('/login', data: {
'username': username,
'password': password,
});

// 保存 Token
await _saveToken(response.data['token']);
return response;

}

// 保存 Token
Future _saveToken(String token) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_tokenKey, token);
}

// 退出登录
Future logout() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_tokenKey); // 移除 Token
}

// GET 请求
Future get(String path, {Map? queryParameters}) async {
return await _dio.get(path, queryParameters: queryParameters);
}

// POST 请求
Future post(String path, {dynamic data}) async {
return await _dio.post(path, data: data);
}
}

代码详解
Token 存储:

使用 shared_preferences 存储用户的 Token,以便后续请求中使用。
_getToken() 方法用于获取存储的 Token。
登录请求:

login 方法发送用户名和密码进行身份验证,成功后保存返回的 Token。
请求拦截:

在请求拦截器中,检查是否有 Token,如果有,则添加到请求头中。
退出登录:

logout 方法移除存储的 Token,以实现用户登出。
三、使用封装的 NetworkService
在 Flutter 应用中使用 NetworkService 进行身份验证非常简单。以下示例展示了如何创建一个登录界面。

  1. 创建登录界面
    在 lib/main.dart 文件中编写以下代码:

import 'package:flutter/material.dart';
import 'services/network_service.dart';

class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State {
final NetworkService _networkService = NetworkService();
final TextEditingController _usernameController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
String _message = '';

void _login() async {
try {
final response = await _networkService.login(
_usernameController.text,
_passwordController.text,
);
setState(() {
_message = '登录成功: ${response.data}';
});
} catch (e) {
setState(() {
_message = '登录失败: $e';
});
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('登录')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _usernameController,
decoration: InputDecoration(labelText: '用户名'),
),
TextField(
controller: _passwordController,
decoration: InputDecoration(labelText: '密码'),
obscureText: true,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _login,
child: Text('登录'),
),
SizedBox(height: 20),
Text(_message),
],
),
),
);
}
}

void main() => runApp(MaterialApp(home: LoginPage()));

代码详解
输入框:使用 TextField 组件获取用户名和密码。
登录按钮:点击按钮后调用 _login 方法进行登录。
状态管理:通过 setState 更新界面,显示登录结果。
写在后面
通过封装 Dio,我们实现了用户身份验证与 Token 的存储和使用。使用 shared_preferences 实现简单的免登录缓存机制,提高用户体验。希望这篇博客能帮助你更好地在 Flutter 中使用 Dio 进行网络请求与身份验证。如有疑问或建议,欢迎讨论!
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lbcyllqj/article/details/143363716

目录
相关文章
|
JSON 缓存 程序员
玩转HarmonyOS NEXT网络请求:从新手到高手的实战秘籍
本文以通俗易懂的方式讲解了HarmonyOS网络请求的核心知识,从基础概念到实战技巧,再到进阶优化,帮助开发者快速上手。通过“点外卖”的类比,形象解释了HTTP请求方法(如GET、POST)和JSON数据格式的作用。同时,提供了封装工具类的示例代码,简化重复操作,并分享了常见问题的解决方法(如权限配置、参数格式、内存泄漏等)。最后,还探讨了如何通过拦截器、缓存机制和重试机制提升请求功能。无论你是新手还是进阶开发者,都能从中受益,快动手实现一个新闻App试试吧!
714 5
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
2190 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
JSON 前端开发 JavaScript
HarmonyOS NEXT 实战系列10-网络通信
本文介绍了网络通信相关知识,包括HTTP协议的工作原理、鸿蒙系统中HTTP模块的使用方法、Promise异步操作处理机制及async/await语法糖的应用,以及JSON数据格式的语法规则与转换方法。重点讲解了HTTP请求响应流程、鸿蒙开发中的网络权限申请与代码实现、Promise三种状态及创建方式,并通过示例说明异步编程技巧和JSON在数据传递中的应用。
467 10
|
Dart 前端开发 IDE
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
本文介绍了如何将现有 Flutter 项目适配鸿蒙系统,详细步骤包括安装 FVM、使用 FVM 安装 Flutter SDK、搭建开发环境、创建项目架构和壳工程等。
1549 7
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
396 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
611 4
鸿蒙开发:切换至基于rcp的网络请求
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
1498 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
826 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
JSON Dart 前端开发
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
1090 8
|
XML JSON 前端开发
一文带你了解 Flutter dio封装
一文带你了解 Flutter dio封装
2344 1