|
| 1 | +import 'dart:io'; |
1 | 2 | import 'package:flutter/material.dart'; |
2 | 3 | import 'package:flutter_bloc/flutter_bloc.dart'; |
3 | 4 | import 'package:wild/pages/auth_cubit.dart'; |
@@ -43,6 +44,7 @@ final darkTheme = ThemeData( |
43 | 44 | ); |
44 | 45 |
|
45 | 46 | Future<void> main() async { |
| 47 | + HttpOverrides.global = _LoggingHttpOverrides(); // ← 新增這行 |
46 | 48 | WidgetsFlutterBinding.ensureInitialized(); |
47 | 49 | await AppInfo.init(); |
48 | 50 | await RustLib.init(); |
@@ -185,3 +187,51 @@ class YourApp extends StatelessWidget { |
185 | 187 | ); |
186 | 188 | } |
187 | 189 | } |
| 190 | + |
| 191 | +class _LoggingHttpOverrides extends HttpOverrides { |
| 192 | + @override |
| 193 | + HttpClient createHttpClient(SecurityContext? context) { |
| 194 | + final base = super.createHttpClient(context); |
| 195 | + return _LoggingHttpClient(base); |
| 196 | + } |
| 197 | +} |
| 198 | + |
| 199 | +class _LoggingHttpClient implements HttpClient { |
| 200 | + final HttpClient _inner; |
| 201 | + _LoggingHttpClient(this._inner); |
| 202 | + |
| 203 | + @override |
| 204 | + Future<HttpClientRequest> openUrl(String method, Uri url) async { |
| 205 | + final startedAt = DateTime.now(); |
| 206 | + print('[HTTP][$method] $url'); |
| 207 | + try { |
| 208 | + final req = await _inner.openUrl(method, url); |
| 209 | + return _LoggingHttpClientRequest(req, url, method, startedAt); |
| 210 | + } catch (e) { |
| 211 | + print('[HTTP][ERR][$method] $url -> $e'); |
| 212 | + rethrow; |
| 213 | + } |
| 214 | + } |
| 215 | + |
| 216 | + // 其他方法交給原本的 client |
| 217 | + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 218 | +} |
| 219 | + |
| 220 | +class _LoggingHttpClientRequest implements HttpClientRequest { |
| 221 | + final HttpClientRequest _inner; |
| 222 | + final Uri url; |
| 223 | + final String method; |
| 224 | + final DateTime startedAt; |
| 225 | + _LoggingHttpClientRequest(this._inner, this.url, this.method, this.startedAt); |
| 226 | + |
| 227 | + @override |
| 228 | + Future<HttpClientResponse> close() async { |
| 229 | + final resp = await _inner.close(); |
| 230 | + final ms = DateTime.now().difference(startedAt).inMilliseconds; |
| 231 | + print('[HTTP][RESP ${resp.statusCode}] $method $url (${ms}ms)'); |
| 232 | + return resp; |
| 233 | + } |
| 234 | + |
| 235 | + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 236 | +} |
| 237 | + |
0 commit comments