Skip to content

Commit 5c0b17a

Browse files
authored
Network panel: disable Header ExpansionTiles when no data (#9492)
1 parent 8a42447 commit 5c0b17a

3 files changed

Lines changed: 72 additions & 22 deletions

File tree

packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,18 @@ const _rowPadding = EdgeInsets.only(
2929
bottom: _rowSpacingPadding,
3030
);
3131

32-
/// Helper to build ExpansionTile widgets for inspector views.
33-
ExpansionTile _buildTile(String title, List<Widget> children, {Key? key}) {
32+
/// Helper to build [ExpansionTile] widgets for inspector views.
33+
ExpansionTile _buildTile(
34+
String title,
35+
List<Widget> children, {
36+
Key? key,
37+
bool enabled = true,
38+
}) {
3439
return ExpansionTile(
3540
key: key,
3641
title: Text(title),
3742
initiallyExpanded: true,
43+
enabled: enabled,
3844
children: children,
3945
);
4046
}
@@ -63,30 +69,70 @@ class HttpRequestHeadersView extends StatelessWidget {
6369
return SelectionArea(
6470
child: ListView(
6571
children: [
66-
_buildTile('General', [
67-
for (final entry in general.entries)
68-
_Row(
69-
entry: entry,
70-
constraints: constraints,
71-
isErrorValue: data.didFail && entry.key == 'statusCode',
72-
),
73-
], key: generalKey),
74-
_buildTile('Response Headers', [
75-
if (responseHeaders != null)
76-
for (final entry in responseHeaders.entries)
77-
_Row(entry: entry, constraints: constraints),
78-
], key: responseHeadersKey),
79-
_buildTile('Request Headers', [
80-
if (requestHeaders != null)
81-
for (final entry in requestHeaders.entries)
82-
_Row(entry: entry, constraints: constraints),
83-
], key: requestHeadersKey),
72+
_buildHeadersTile(
73+
'General',
74+
general,
75+
constraints,
76+
key: generalKey,
77+
),
78+
_buildHeadersTile(
79+
'Response Headers',
80+
responseHeaders,
81+
constraints,
82+
key: responseHeadersKey,
83+
),
84+
_buildHeadersTile(
85+
'Request Headers',
86+
requestHeaders,
87+
constraints,
88+
key: requestHeadersKey,
89+
),
8490
],
8591
),
8692
);
8793
},
8894
);
8995
}
96+
97+
ExpansionTile _buildHeadersTile(
98+
String title,
99+
Map<String, dynamic>? headers,
100+
BoxConstraints constraints, {
101+
Key? key,
102+
}) {
103+
final hasHeaders = headers != null && headers.isNotEmpty;
104+
return _buildTile(
105+
title,
106+
[
107+
if (hasHeaders)
108+
for (final entry in headers.entries)
109+
_Row(
110+
entry: entry,
111+
constraints: constraints,
112+
isErrorValue: data.didFail && entry.key == 'statusCode',
113+
)
114+
else
115+
Container(
116+
width: constraints.minWidth,
117+
padding: _rowPadding,
118+
child: Row(
119+
crossAxisAlignment: CrossAxisAlignment.start,
120+
children: [
121+
Text(
122+
'No data',
123+
style: TextStyle(
124+
fontStyle: FontStyle.italic,
125+
color: Colors.grey.shade600,
126+
),
127+
),
128+
],
129+
),
130+
),
131+
],
132+
key: key,
133+
enabled: hasHeaders,
134+
);
135+
}
90136
}
91137

92138
class _Row extends StatelessWidget {

packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ TODO: Remove this section if there are not any general updates.
4343
## Network profiler updates
4444

4545
* Fixed layout of the "error count" badge in the tab name.
46+
* Fix display of "Response Headers" and "Request Headers" when there are no
47+
headers.
4648

4749
## Logging updates
4850

packages/devtools_app/test/screens/network/network_profiler_test.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,16 @@ void main() {
167167
final ExpansionTile requestsTile = tester.widget(
168168
find.byKey(HttpRequestHeadersView.requestHeadersKey),
169169
);
170-
final numRequestHeaders = data.requestHeaders?.length ?? 0;
170+
// The '1' fallback is for the 'No data' row.
171+
final numRequestHeaders = data.requestHeaders?.length ?? 1;
171172
expect(requestsTile.children.length, numRequestHeaders);
172173

173174
// Check contents of response headers.
174175
final ExpansionTile responsesTile = tester.widget(
175176
find.byKey(HttpRequestHeadersView.responseHeadersKey),
176177
);
177-
final numResponseHeaders = data.responseHeaders?.length ?? 0;
178+
// The '1' fallback is for the 'No data' row.
179+
final numResponseHeaders = data.responseHeaders?.length ?? 1;
178180
expect(responsesTile.children.length, numResponseHeaders);
179181
}
180182

0 commit comments

Comments
 (0)