Skip to content

Commit 0dbead1

Browse files
authored
Network: add a banner indicating when we are not logging network requests (#9495)
1 parent 5c0b17a commit 0dbead1

2 files changed

Lines changed: 110 additions & 64 deletions

File tree

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

Lines changed: 104 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -206,72 +206,115 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls>
206206

207207
final screenWidth = ScreenSize(context).width;
208208
final hasRequests = controller.filteredData.value.isNotEmpty;
209-
return Row(
209+
return Column(
210210
children: [
211-
StartStopRecordingButton(
212-
recording: _recording,
213-
onPressed: () async => await controller.togglePolling(!_recording),
214-
tooltipOverride: _recording
215-
? 'Stop recording network traffic'
216-
: 'Resume recording network traffic',
217-
minScreenWidthForText: double.infinity,
218-
gaScreen: gac.network,
219-
gaSelection: _recording ? gac.pause : gac.resume,
220-
),
221-
const SizedBox(width: denseSpacing),
222-
ClearButton(
223-
minScreenWidthForText: _NetworkProfilerControls._includeTextWidth,
224-
gaScreen: gac.network,
225-
gaSelection: gac.clear,
226-
onPressed: controller.clear,
211+
Row(
212+
children: [
213+
StartStopRecordingButton(
214+
recording: _recording,
215+
onPressed: () async =>
216+
await controller.togglePolling(!_recording),
217+
tooltipOverride: _recording
218+
? 'Stop recording network traffic'
219+
: 'Resume recording network traffic',
220+
minScreenWidthForText: double.infinity,
221+
gaScreen: gac.network,
222+
gaSelection: _recording ? gac.pause : gac.resume,
223+
),
224+
const SizedBox(width: denseSpacing),
225+
ClearButton(
226+
minScreenWidthForText: _NetworkProfilerControls._includeTextWidth,
227+
gaScreen: gac.network,
228+
gaSelection: gac.clear,
229+
onPressed: controller.clear,
230+
),
231+
const SizedBox(width: denseSpacing),
232+
// TODO(kenz): fix focus issue when state is refreshed
233+
Expanded(
234+
child: SearchField<NetworkController>(
235+
searchController: controller,
236+
searchFieldEnabled: hasRequests,
237+
searchFieldWidth: screenWidth <= MediaSize.xs
238+
? defaultSearchFieldWidth
239+
: wideSearchFieldWidth,
240+
),
241+
),
242+
const SizedBox(width: denseSpacing),
243+
Expanded(
244+
child: StandaloneFilterField<NetworkRequest>(
245+
controller: controller,
246+
filteredItem: 'request',
247+
),
248+
),
249+
const SizedBox(width: denseSpacing),
250+
if (FeatureFlags.networkSaveLoad.isEnabled)
251+
OpenSaveButtonGroup(
252+
screenId: ScreenMetaData.network.id,
253+
saveFormats: const [SaveFormat.devtools, SaveFormat.har],
254+
gaItemForSaveFormatSelection: (SaveFormat format) =>
255+
switch (format) {
256+
SaveFormat.devtools => gac.saveFile,
257+
SaveFormat.har => gac.NetworkEvent.downloadAsHar.name,
258+
},
259+
onSave: (SaveFormat format) async {
260+
switch (format) {
261+
case SaveFormat.devtools:
262+
await controller.fetchFullDataBeforeExport();
263+
controller.exportData();
264+
case SaveFormat.har:
265+
await controller.exportAsHarFile();
266+
}
267+
},
268+
)
269+
else
270+
DownloadButton(
271+
tooltip: 'Download as .har file',
272+
minScreenWidthForText:
273+
_NetworkProfilerControls._includeTextWidth,
274+
onPressed: controller.exportAsHarFile,
275+
gaScreen: gac.network,
276+
gaSelection: gac.NetworkEvent.downloadAsHar.name,
277+
),
278+
],
227279
),
228-
const SizedBox(width: denseSpacing),
229-
// TODO(kenz): fix focus issue when state is refreshed
230-
Expanded(
231-
child: SearchField<NetworkController>(
232-
searchController: controller,
233-
searchFieldEnabled: hasRequests,
234-
searchFieldWidth: screenWidth <= MediaSize.xs
235-
? defaultSearchFieldWidth
236-
: wideSearchFieldWidth,
280+
if (!_recording)
281+
const Padding(
282+
padding: EdgeInsets.only(top: intermediateSpacing),
283+
child: _RecordingPausedBanner(),
237284
),
285+
],
286+
);
287+
}
288+
}
289+
290+
class _RecordingPausedBanner extends StatelessWidget {
291+
const _RecordingPausedBanner();
292+
293+
@override
294+
Widget build(BuildContext context) {
295+
final theme = Theme.of(context);
296+
return Card(
297+
color: theme.colorScheme.secondaryContainer,
298+
child: Padding(
299+
padding: const EdgeInsets.symmetric(
300+
vertical: densePadding,
301+
horizontal: denseSpacing,
238302
),
239-
const SizedBox(width: denseSpacing),
240-
Expanded(
241-
child: StandaloneFilterField<NetworkRequest>(
242-
controller: controller,
243-
filteredItem: 'request',
244-
),
303+
child: Row(
304+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
305+
children: [
306+
Expanded(
307+
child: Text(
308+
'Network traffic recording is paused. Click the resume button '
309+
'to continue.',
310+
style: theme.regularTextStyle.copyWith(
311+
color: theme.colorScheme.onSecondaryContainer,
312+
),
313+
),
314+
),
315+
],
245316
),
246-
const SizedBox(width: denseSpacing),
247-
if (FeatureFlags.networkSaveLoad.isEnabled)
248-
OpenSaveButtonGroup(
249-
screenId: ScreenMetaData.network.id,
250-
saveFormats: const [SaveFormat.devtools, SaveFormat.har],
251-
gaItemForSaveFormatSelection: (SaveFormat format) =>
252-
switch (format) {
253-
SaveFormat.devtools => gac.saveFile,
254-
SaveFormat.har => gac.NetworkEvent.downloadAsHar.name,
255-
},
256-
onSave: (SaveFormat format) async {
257-
switch (format) {
258-
case SaveFormat.devtools:
259-
await controller.fetchFullDataBeforeExport();
260-
controller.exportData();
261-
case SaveFormat.har:
262-
await controller.exportAsHarFile();
263-
}
264-
},
265-
)
266-
else
267-
DownloadButton(
268-
tooltip: 'Download as .har file',
269-
minScreenWidthForText: _NetworkProfilerControls._includeTextWidth,
270-
onPressed: controller.exportAsHarFile,
271-
gaScreen: gac.network,
272-
gaSelection: gac.NetworkEvent.downloadAsHar.name,
273-
),
274-
],
317+
),
275318
);
276319
}
277320
}

packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ TODO: Remove this section if there are not any general updates.
4242

4343
## Network profiler updates
4444

45-
* 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.
45+
* Fixed layout of the "error count" badge in the tab name. -
46+
[#9470](https://github.com/flutter/devtools/pull/9470)
47+
* Fixed display of "Response Headers" and "Request Headers" when there are no
48+
headers. - [#9492](https://github.com/flutter/devtools/pull/9492)
49+
* Added a banner to clearly indicate when DevTools is not logging network
50+
requests. - [#9495](https://github.com/flutter/devtools/pull/9495)
4851

4952
## Logging updates
5053

0 commit comments

Comments
 (0)