flutter - 为什么发送以下请求会出现未捕获的异常?

标签 flutter dart

我有以下 Flutter & Dart 代码函数,它向服务器发送请求:

Future<void> autoAuth(BuildContext ctx) async {
  final url = Uri.parse('${this._baseURL.toString()}/auto-auth');

  try {
    final deviceStorage = await SharedPreferences.getInstance();

    if (deviceStorage.getString('refreshToken') == null) {
      return this._setUser(null);
    }

    final response = await http.post(url, headers: {
      'Authorization': 'Bearer ${deviceStorage.getString('refreshToken')!}',
    }).timeout(const Duration(seconds: 3));
    final Map<String, dynamic> responseBody = json.decode(response.body);

    if (responseBody['success']) {
      this._refreshAccessToken(ctx, deviceStorage);

      return this._setUser(new User(
        id: responseBody['data']['id'],
        isSubscribed: responseBody['data']['isSubscribed'],
        playlistId: responseBody['data']['playlistId'],
      ));
    }

    this._setUser(null);
  } on SocketException {
    this._setUser(null);

    throw Error();
  } on TimeoutException {
    this._setUser(null);

    throw Error();
  } catch (_) {
    this._setUser(null);
  }
}

请注意,该 url 是故意错误的,因此请求将超时。 但是,为此,我在未来的请求中编码:.timeout(...)。因此,基本上,3 秒后它应该被 on TimeoutException 异常捕获捕获。

确实如此。然而,大约 1 分钟后(可能是 dart 中 http 请求的默认超时),我收到一个未捕获的异常,因为请求已超时。我哪里错了?

最佳答案

这是因为你的使用方式不对。您使用的 .timeout 代码是任何 future 的通用超时。因此,您捕获了 future 超时的错误,但没有捕获由 http 请求超时生成的错误。

要正确使用它,首先添加以下导入:import 'package:http/io_client.dart' as http;

然后将代码更改为:

final ioClient = HttpClient();
ioClient.connectionTimeout = const Duration(seconds: 3);
final client = http.IOClient(ioClient);

final response = await client.post(url, headers: {
  'Authorization': 'Bearer ${deviceStorage.getString('refreshToken')!}',
});

关于flutter - 为什么发送以下请求会出现未捕获的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69667673/

相关文章:

ios - 在 Flutter 中使用 MPMediaPickerController

rest - Dart 将 SSL 证书和 key 添加到 HttpClient

dart - 如何将所有 map 键放入列表中?

dart - Flutter/dart-从mysql服务器数据库下载数据

flutter - flutter 中的 SuperScript 和 SubScript

flutter :文本字段中的 textDirection 不起作用

flutter - Flutter 中 Futurebuilder 中的快照到底意味着什么?

android - 在 flutter 中更改 android 设备声音模式

dart - Webdev服务命令

flutter - 你如何从 Dart 代码中检测宿主平台?