11

この問題はすでに他の人によって指摘されています (ここなど)。原因はわかったかもしれませんが、上位httpライブラリを使用する場合、まだ解決策が見つかりません。例えば:

import 'package:http/http.dart';

// yes, pwd is String, it's just a test...
Future<Response> login(String user, String pwd) {
  final authHeader = encodeBasicCredentials(user, pwd);
  return get(
    'http://192.168.0.100:8080/login',
    headers: <String, String>{
    HttpHeaders.AUTHORIZATION: authHeader,
    },
  ));
}

SocketExceptionたとえば、ホストに到達できない場合(私の場合、間違ったホストIP)、スローされた a をキャッチする方法が見つかりません。を でラップするか、 を使用してみawaitましtry/catchFuture.catchError

これは、例外のスタック トレースです。

[ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 4036): SocketException: OS Error: Connection refused, errno = 111, address = 192.168.0.100, port = 35588
E/flutter ( 4036): #0      IOClient.send (package:http/src/io_client.dart:30:23)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #1      BaseClient._sendUnstreamed (package:http/src/base_client.dart:171:38)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #2      BaseClient.get (package:http/src/base_client.dart:34:5)
E/flutter ( 4036): #3      get.<anonymous closure> (package:http/http.dart:47:34)
E/flutter ( 4036): #4      _withClient (package:http/http.dart:167:20)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #5      get (package:http/http.dart:47:3)
4

3 に答える 3

16

応答を待つことができるようにlogin変更できます。asyncこれにより、例外をキャッチできます (そして、たとえば、nullの代わりに戻りますResponse)。

Future<Response> login(String user, String pwd) async {
  final String authHeader = encodeBasicCredentials(user, pwd);
  try {
    return await get(
        'http://192.168.0.100:8080/login',
        headers: {
          HttpHeaders.AUTHORIZATION: authHeader,
        },
      );
  } catch (e) {
    print(e);
    return null;
  }
}
于 2018-07-13T14:39:22.657 に答える