flutter如何实现网络库的keep-alive功能

在Flutter中如何实现网络库的keep-alive功能?我使用的是Dio库,但发现每次请求都会重新建立连接,导致性能下降。请问有没有办法像Android的OkHttp那样保持长连接?需要配置哪些参数或者是否有其他更优的方案?

2 回复

在Flutter中,使用http库时,默认支持HTTP/1.1的Keep-Alive。若需自定义,可通过HttpClient设置连接保持时长:

final client = HttpClient();
client.idleTimeout = Duration(seconds: 15); // 设置空闲超时

或使用dio库时配置HttpClientAdapter实现持久连接。

更多关于flutter如何实现网络库的keep-alive功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中实现网络库的 keep-alive 功能,可以通过以下方式:

1. 使用 http 库并配置连接保持

http 库中,默认情况下,Client 会复用连接。你可以创建一个持久化的 Client 实例:

import 'package:http/http.dart' as http;

// 创建持久化 Client
final client = http.Client();

// 发送请求
Future<void> fetchData() async {
  try {
    var response = await client.get(Uri.parse('https://api.example.com/data'));
    print(response.body);
  } finally {
    // 不再需要时关闭
    // client.close();
  }
}

2. 使用 dio 库(推荐)

dio 内置连接池,默认启用 keep-alive,并支持更多配置:

import 'package:dio/dio.dart';

void main() {
  final dio = Dio(BaseOptions(
    baseUrl: 'https://api.example.com',
    connectTimeout: Duration(seconds: 5),
    receiveTimeout: Duration(seconds: 3),
  ));

  // 可选的连接池配置
  (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
    client.idleTimeout = Duration(seconds: 10); // 空闲超时
    return client;
  };

  // 发送请求
  fetchData(dio);
}

Future<void> fetchData(Dio dio) async {
  try {
    var response = await dio.get('/data');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

3. 关键配置说明

  • 连接复用:两个库默认都支持,无需额外代码。
  • 空闲超时:在 dio 中可通过 idleTimeout 设置(默认与服务器协商)。
  • 全局使用:建议在 App 生命周期内复用同一个 ClientDio 实例。

4. 注意事项

  • 避免频繁创建和关闭 Client,以充分利用 keep-alive。
  • 在 App 退出或不再需要时,调用 client.close()dio.close() 释放资源。

使用 dio 更简单且功能丰富,适合大多数场景。

回到顶部