flutter 网络请求封装
时间: 2023-09-06 17:13:41 浏览: 161
Flutter 的网络请求可以使用 http 包进行封装,也可以使用第三方库如 dio、retrofit 等进行封装。以下是使用 dio 进行网络请求封装的示例:
1. 引入 dio 包
在 pubspec.yaml 文件中引入 dio 包:
```dart
dependencies:
dio: ^4.0.0
```
然后运行 `flutter pub get` 安装依赖。
2. 创建网络请求工具类
```dart
import 'package:dio/dio.dart';
class HttpUtil {
static const String baseUrl = "https://example.com/api/";
static Dio _dio;
static Dio get dio {
if (_dio == null) {
_dio = Dio(BaseOptions(
baseUrl: baseUrl,
connectTimeout: 5000,
receiveTimeout: 3000,
));
}
return _dio;
}
static Future<Response> get(String path, {Map<String, dynamic> params}) async {
try {
Response response = await dio.get(path, queryParameters: params);
return response;
} on DioError catch (e) {
print(e.message);
return null;
}
}
static Future<Response> post(String path, {Map<String, dynamic> params}) async {
try {
Response response = await dio.post(path, data: params);
return response;
} on DioError catch (e) {
print(e.message);
return null;
}
}
}
```
3. 使用网络请求工具类
```dart
import 'package:flutter/material.dart';
import 'package:your_app/http_util.dart';
class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
String _response = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("My Page"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
_fetchData();
},
child: Text("Fetch Data"),
),
SizedBox(height: 20),
Text(_response),
],
),
),
);
}
void _fetchData() async {
Response response = await HttpUtil.get("users/1");
if (response != null) {
setState(() {
_response = response.data.toString();
});
}
}
}
```
这个示例中,我们在 `HttpUtil` 类中封装了 `get` 和 `post` 请求,然后在 `MyPage` 页面中使用 `HttpUtil` 进行网络请求,并将获取到的数据显示在页面上。当然,你可以根据自己的需求进行更改和扩展。
阅读全文