【问题标题】:When to close HTTP Client in Flutter app?Flutter 应用程序中的 HTTP 客户端何时关闭?
【发布时间】:2019-12-28 15:19:19
【问题描述】:

我的 Flutter 移动应用与我的后端服务器通信。文档说最好使用Client 类(IOClient)而不是普通的getput 等方法来维持对同一服务器的多个请求的持久连接。 Docs 还说:

在使用完每个客户端后关闭它是很重要的;失败 这样做会导致 Dart 进程挂起。

我不明白什么时候需要关闭客户端,因为几乎所有应用程序屏幕都需要 HTTP 连接到同一台服务器。这里的最佳做法是什么?

更新:

是否可以仅在应用终止之前关闭Client,还是应该在每次隐藏应用时关闭它(进入paused 状态)?

【问题讨论】:

  • 他们似乎删除了您在文档中引用的行。您选择了哪种解决方案?
  • 我已更新链接,使其指向关闭方法本身。我只在应用程序终止之前关闭客户端。它对我有用,不确定它是否会导致任何问题(很少发生)。
  • 我一直在搜索,如果应用程序终止(例如第一页的dispose),似乎不会执行任何飞镖代码。你在哪里调用了 close 方法?
  • @HảiNguyễn 我订阅了应用程序生命周期更改并在didChangeAppLifecycleState 方法if (state == AppLifecycleState.detached) 中关闭客户端

标签: flutter dart


【解决方案1】:

如果您在所有应用程序中不断使用Client,请将其关闭在Application 类中。您正在使用的类 MaterialAppCupertinoApp 里面。设为StatefulWidget,因为我们将使用它的生命周期。

一个例子:

// This is our Api class, it should be singleton to handle easily
// and probably we won't need extra instances of our Api class
class Api {
  final client = http.Client();

  Api._internal();

  static final _singleton = Api._internal();

  factory Api() => _singleton;

}

final api = Api();

// This is our App class
class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp();
  }

//  Alternative way to dispose
//  @override
//  void deactivate() {
//    api.client.close();
//    super.deactivate();
//  }

  @override
  void dispose() {
    api.client.close();
    super.dispose();
  }
}

为什么采用这种方法?因为如果您的应用程序正在使用,您的 App 类将始终处于活动状态。当它关闭时,我们的 App 类也将被释放。

有太多的解决方案/方法,但如果您不是专家或其他人,您可以轻松使用它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2023-03-31
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多