From b1b848ca7d83edbec6438ab5d0bf6864ae9ec7fd Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Fri, 27 Mar 2026 23:24:02 +0530 Subject: [PATCH 01/10] Added size support to network tab --- .../src/screens/network/network_model.dart | 9 ++++++++ .../network_request_inspector_views.dart | 17 ++++++++++++++ .../src/screens/network/network_screen.dart | 23 +++++++++++++++++++ .../src/shared/http/http_request_data.dart | 14 +++++++++++ 4 files changed, 63 insertions(+) diff --git a/packages/devtools_app/lib/src/screens/network/network_model.dart b/packages/devtools_app/lib/src/screens/network/network_model.dart index 8a6697fbe65..9ccc3c5217a 100644 --- a/packages/devtools_app/lib/src/screens/network/network_model.dart +++ b/packages/devtools_app/lib/src/screens/network/network_model.dart @@ -29,6 +29,9 @@ abstract class NetworkRequest int? get port; + int? get requestBytes => null; + int? get responseBytes => null; + bool get didFail; /// True if the request hasn't completed yet. @@ -160,6 +163,12 @@ class Socket extends NetworkRequest { @override int get port => _socket.port; + @override + int get requestBytes => writeBytes; + + @override + int get responseBytes => readBytes; + // TODO(kenz): what determines a web socket request failure? @override bool get didFail => false; diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart index 831b3e52052..2c3a1f1e0d0 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart @@ -658,6 +658,14 @@ class NetworkRequestOverviewView extends StatelessWidget { ), const SizedBox(height: defaultSpacing), ], + const SizedBox(height: defaultSpacing), + _buildRow( + context: context, + title: 'Size', + child: _valueText(_formatBytes(data.responseBytes)), + ), + const SizedBox(height: defaultSpacing), + if (data.contentType != null) ...[ _buildRow( context: context, @@ -669,6 +677,15 @@ class NetworkRequestOverviewView extends StatelessWidget { ]; } + String _formatBytes(int? bytes) { + if (bytes == null) return '-'; + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) { + return '${(bytes / 1024).toStringAsFixed(1)} KB'; + } + return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB'; + } + List _buildTimingOverview(BuildContext context) { return [ _buildRow( diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 5171c5e6736..24187b0e4d8 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -371,6 +371,7 @@ class NetworkRequestsTable extends StatelessWidget { statusColumn, typeColumn, durationColumn, + const ResponseSizeColumn(), timestampColumn, actionsColumn, ]; @@ -405,6 +406,28 @@ class NetworkRequestsTable extends StatelessWidget { } } +String _formatBytes(int? bytes) { + if (bytes == null) return '-'; + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) { + return '${(bytes / 1024).toStringAsFixed(1)} KB'; + } + return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB'; +} + +class ResponseSizeColumn extends ColumnData { + const ResponseSizeColumn() + : super('Size', alignment: ColumnAlignment.right, fixedWidthPx: 90); + + @override + int? getValue(NetworkRequest data) => data.responseBytes; + + @override + String getDisplayValue(NetworkRequest data) { + return _formatBytes(data.responseBytes); + } +} + class AddressColumn extends ColumnData implements ColumnRenderer { AddressColumn() diff --git a/packages/devtools_app/lib/src/shared/http/http_request_data.dart b/packages/devtools_app/lib/src/shared/http/http_request_data.dart index 8be9458d23f..9c432eb295d 100644 --- a/packages/devtools_app/lib/src/shared/http/http_request_data.dart +++ b/packages/devtools_app/lib/src/shared/http/http_request_data.dart @@ -212,6 +212,20 @@ class DartIOHttpRequestData extends NetworkRequest { return connectionInfo != null ? connectionInfo[_localPortKey] : null; } + @override + int? get responseBytes { + final headers = responseHeaders; + final contentLength = headers?['content-length']; + + if (contentLength is String) { + return int.tryParse(contentLength); + } + if (contentLength is List && contentLength.isNotEmpty) { + return int.tryParse(contentLength.first); + } + return null; + } + /// True if the HTTP request hasn't completed yet, determined by the lack of /// an end time in the response data. @override From aa06a0c63cf0ba2948c2c4ba9e9de35e17dad66b Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 00:09:09 +0530 Subject: [PATCH 02/10] Added release notes entry for network response size feature --- packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index d5d4a6c8a09..dad97a9bbf2 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -43,7 +43,8 @@ TODO: Remove this section if there are not any updates. ## Network profiler updates -TODO: Remove this section if there are not any updates. +- Added response size ("Size") column to the Network tab and displayed size in the request inspector overview. - + [#9744](https://github.com/flutter/devtools/pull/9744) ## Logging updates From 63e204148b9ec22b2d1269868af40efac45616c9 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 00:13:00 +0530 Subject: [PATCH 03/10] Resolve merge conflict in release notes --- packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index dad97a9bbf2..46f7b9fce16 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -43,9 +43,10 @@ TODO: Remove this section if there are not any updates. ## Network profiler updates -- Added response size ("Size") column to the Network tab and displayed size in the request inspector overview. - +- Added response size ("Res Size") column to the Network tab and displayed response size in the request inspector overview. - [#9744](https://github.com/flutter/devtools/pull/9744) +- Added a filter setting to hide HTTP-profiler socket data. [#9698](https://github.com/flutter/devtools/pull/9698) ## Logging updates TODO: Remove this section if there are not any updates. From 49aa68b38c78e6fac34afea3976a54a0dd1ce3c0 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 00:29:09 +0530 Subject: [PATCH 04/10] Added documentation for byte formatting --- .../src/screens/network/network_request_inspector_views.dart | 5 +++++ .../devtools_app/lib/src/screens/network/network_screen.dart | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart index 2c3a1f1e0d0..af2f0304bca 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart @@ -677,6 +677,11 @@ class NetworkRequestOverviewView extends StatelessWidget { ]; } + // Output Formats: + // - 512 → "512 B" + // - 2048 → "2.0 KB" + // - 1048576 → "1.0 MB" + // Values are rounded to one decimal place for KB and MB. String _formatBytes(int? bytes) { if (bytes == null) return '-'; if (bytes < 1024) return '$bytes B'; diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 24187b0e4d8..dd5b92a7b59 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -406,6 +406,11 @@ class NetworkRequestsTable extends StatelessWidget { } } +// Output Formats: +// - 512 → "512 B" +// - 2048 → "2.0 KB" +// - 1048576 → "1.0 MB" +// Values are rounded to one decimal place for KB and MB. String _formatBytes(int? bytes) { if (bytes == null) return '-'; if (bytes < 1024) return '$bytes B'; From 4bb20f1b40adb88e1673f1cc59d34d89827b4a38 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 01:02:42 +0530 Subject: [PATCH 05/10] Fix lint: match parameter names with base class --- .../devtools_app/lib/src/screens/network/network_screen.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index dd5b92a7b59..ab79fb7a5c8 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -428,8 +428,8 @@ class ResponseSizeColumn extends ColumnData { int? getValue(NetworkRequest data) => data.responseBytes; @override - String getDisplayValue(NetworkRequest data) { - return _formatBytes(data.responseBytes); + String getDisplayValue(NetworkRequest dataObject) { + return _formatBytes(dataObject.responseBytes); } } From 1b4fc2547eeb3d841a3d506bedce0b2f5f1153c2 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 01:10:49 +0530 Subject: [PATCH 06/10] Fix lint: correct parameter name in AddressColumn --- .../devtools_app/lib/src/screens/network/network_screen.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index ab79fb7a5c8..33953cc2d05 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -443,8 +443,8 @@ class AddressColumn extends ColumnData ); @override - String getValue(NetworkRequest dataObject) { - return dataObject.uri; + String getValue(NetworkRequest data) { + return data.uri; } @override From ec2e7d962d3317b25c519f870cf105bcac6bd817 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 01:14:25 +0530 Subject: [PATCH 07/10] Fix type handling for content-length header in responseBytes --- .../lib/src/shared/http/http_request_data.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/shared/http/http_request_data.dart b/packages/devtools_app/lib/src/shared/http/http_request_data.dart index aafa3b89a02..b5e716b28b4 100644 --- a/packages/devtools_app/lib/src/shared/http/http_request_data.dart +++ b/packages/devtools_app/lib/src/shared/http/http_request_data.dart @@ -236,7 +236,14 @@ class DartIOHttpRequestData extends NetworkRequest { return int.tryParse(contentLength); } if (contentLength is List && contentLength.isNotEmpty) { - return int.tryParse(contentLength.first); + final first = contentLength.first; + + if (first is int) { + return first; + } + if (first is String) { + return int.tryParse(first); + } } return null; } From 3c17534d8bbbe130da3ad4c5bc58f3b362be8a11 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 01:24:11 +0530 Subject: [PATCH 08/10] Fix layout spacing to ensure consistent widget tree --- .../src/screens/network/network_request_inspector_views.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart index af2f0304bca..506ad844ca6 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart @@ -658,10 +658,10 @@ class NetworkRequestOverviewView extends StatelessWidget { ), const SizedBox(height: defaultSpacing), ], - const SizedBox(height: defaultSpacing), + _buildRow( context: context, - title: 'Size', + title: 'Response Size', child: _valueText(_formatBytes(data.responseBytes)), ), const SizedBox(height: defaultSpacing), From 4257c47e1546ec35707b8d3651bad86a759efff3 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sat, 28 Mar 2026 01:34:46 +0530 Subject: [PATCH 09/10] Fix variable placement for response size rendering --- .../src/screens/network/network_request_inspector_views.dart | 3 ++- .../devtools_app/lib/src/screens/network/network_screen.dart | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart index 506ad844ca6..19eb83daf9c 100644 --- a/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart +++ b/packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart @@ -625,6 +625,7 @@ class NetworkRequestOverviewView extends StatelessWidget { } List _buildGeneralRows(BuildContext context) { + final bytes = data.responseBytes; return [ // TODO(kenz): show preview for requests (png, response body, proto) _buildRow( @@ -662,7 +663,7 @@ class NetworkRequestOverviewView extends StatelessWidget { _buildRow( context: context, title: 'Response Size', - child: _valueText(_formatBytes(data.responseBytes)), + child: _valueText(bytes != null ? _formatBytes(bytes) : '-'), ), const SizedBox(height: defaultSpacing), diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 33953cc2d05..807ec98c669 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -429,7 +429,8 @@ class ResponseSizeColumn extends ColumnData { @override String getDisplayValue(NetworkRequest dataObject) { - return _formatBytes(dataObject.responseBytes); + final bytes = dataObject.responseBytes; + return bytes != null ? _formatBytes(bytes) : '-'; } } From 6fb03f97381547ade99c42d5b42f5a26d8b7e859 Mon Sep 17 00:00:00 2001 From: VictoWolf Date: Sun, 29 Mar 2026 10:58:04 +0530 Subject: [PATCH 10/10] Fix parameter name to match ColumnData override --- .../devtools_app/lib/src/screens/network/network_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 807ec98c669..070bf270941 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -425,7 +425,7 @@ class ResponseSizeColumn extends ColumnData { : super('Size', alignment: ColumnAlignment.right, fixedWidthPx: 90); @override - int? getValue(NetworkRequest data) => data.responseBytes; + int? getValue(NetworkRequest dataObject) => dataObject.responseBytes; @override String getDisplayValue(NetworkRequest dataObject) {