@@ -45,24 +45,22 @@ enum NetworkResponseViewType {
4545
4646enum _NetworkTrafficType { http, socket }
4747
48+ /// Screen controller for the Network screen.
49+ ///
50+ /// This controller can be accessed from anywhere in DevTools, as long as it was
51+ /// first registered, by
52+ /// calling `screenControllers.lookup<NetworkController>()` .
53+ ///
54+ /// The controller lifecycle is managed by the [ScreenControllers] class. The
55+ /// `init` method is called lazily upon the first controller access from
56+ /// `screenControllers` . The `dispose` method is called by `screenControllers`
57+ /// when DevTools is destroying a set of DevTools screen controllers.
4858class NetworkController extends DevToolsScreenController
4959 with
5060 SearchControllerMixin <NetworkRequest >,
5161 FilterControllerMixin <NetworkRequest >,
5262 OfflineScreenControllerMixin ,
5363 AutoDisposeControllerMixin {
54- NetworkController () {
55- _networkService = NetworkService (this );
56- _currentNetworkRequests = CurrentNetworkRequests ();
57- _initHelper ();
58- addAutoDisposeListener (
59- _currentNetworkRequests,
60- _filterAndRefreshSearchMatches,
61- );
62- // TODO(https://github.com/flutter/devtools/issues/7727): add support for
63- // persisting network filter.
64- initFilterController ();
65- }
6664 List <DartIOHttpRequestData >? _httpRequests;
6765
6866 Future <String ?> exportAsHarFile () async {
@@ -146,9 +144,7 @@ class NetworkController extends DevToolsScreenController
146144 ValueListenable <bool > get recordingNotifier => _recordingNotifier;
147145 final _recordingNotifier = ValueNotifier <bool >(false );
148146
149- @visibleForTesting
150- NetworkService get networkService => _networkService;
151- late NetworkService _networkService;
147+ final networkService = NetworkService ();
152148
153149 /// The timeline timestamps are relative to when the VM started.
154150 ///
@@ -168,6 +164,32 @@ class NetworkController extends DevToolsScreenController
168164 @visibleForTesting
169165 bool get isPolling => _pollingTimer != null ;
170166
167+ static const _pollingDuration = Duration (milliseconds: 2000 );
168+
169+ @override
170+ void init () {
171+ super .init ();
172+ _currentNetworkRequests = CurrentNetworkRequests ();
173+ _initHelper ();
174+ addAutoDisposeListener (
175+ _currentNetworkRequests,
176+ _filterAndRefreshSearchMatches,
177+ );
178+ initFilterController ();
179+ }
180+
181+ @override
182+ void dispose () {
183+ // Cancel and dispose the polling timer before disposing anything else.
184+ _pollingTimer? .dispose ();
185+ _pollingTimer = null ;
186+ _currentResponseViewType.dispose ();
187+ selectedRequest.dispose ();
188+ _recordingNotifier.dispose ();
189+ _currentNetworkRequests.dispose ();
190+ super .dispose ();
191+ }
192+
171193 void _initHelper () async {
172194 if (offlineDataController.showingOfflineData.value) {
173195 await maybeLoadOfflineData (
@@ -254,8 +276,8 @@ class NetworkController extends DevToolsScreenController
254276 _pollingTimer ?? = DebounceTimer .periodic (
255277 // TODO(kenz): look into improving performance by caching more data.
256278 // Polling less frequently helps performance.
257- const Duration (milliseconds : 2000 ) ,
258- _networkService .refreshNetworkData,
279+ _pollingDuration ,
280+ networkService .refreshNetworkData,
259281 );
260282 } else {
261283 _pollingTimer? .cancel ();
@@ -286,10 +308,10 @@ class NetworkController extends DevToolsScreenController
286308 // Cancel existing polling timer before starting recording.
287309 _updatePollingState (false );
288310
289- _networkService .updateLastHttpDataRefreshTime (
311+ networkService .updateLastHttpDataRefreshTime (
290312 alreadyRecordingHttp: alreadyRecordingHttp,
291313 );
292- final timestamp = await _networkService .updateLastSocketDataRefreshTime (
314+ final timestamp = await networkService .updateLastSocketDataRefreshTime (
293315 alreadyRecordingSocketData: alreadyRecordingSocketData,
294316 );
295317
@@ -319,7 +341,9 @@ class NetworkController extends DevToolsScreenController
319341 }
320342
321343 Future <void > stopRecording () async {
322- await togglePolling (false );
344+ if (! disposed) {
345+ await togglePolling (false );
346+ }
323347 }
324348
325349 Future <void > togglePolling (bool state) async {
@@ -339,8 +363,8 @@ class NetworkController extends DevToolsScreenController
339363 /// This will ensure that future fetches for http and socket requests will at
340364 /// most fetch requests since [updateLastRefreshTime] was called.
341365 Future <void > updateLastRefreshTime () async {
342- _networkService .updateLastHttpDataRefreshTime ();
343- await _networkService .updateLastSocketDataRefreshTime ();
366+ networkService .updateLastHttpDataRefreshTime ();
367+ await networkService .updateLastSocketDataRefreshTime ();
344368 }
345369
346370 Future <bool > _recordingNetworkTraffic ({
@@ -370,12 +394,21 @@ class NetworkController extends DevToolsScreenController
370394 /// Clears the HTTP profile and socket profile from the vm, and resets the
371395 /// last refresh timestamp to the current time.
372396 Future <void > clear () async {
373- await _networkService .clearData ();
397+ await networkService .clearData ();
374398 _currentNetworkRequests.clear ();
375399 _filterAndRefreshSearchMatches ();
376400 _updateSelection ();
377401 }
378402
403+ @override
404+ void setActiveFilter ({
405+ String ? query,
406+ SettingFilters <NetworkRequest >? settingFilters,
407+ }) {
408+ super .setActiveFilter (query: query, settingFilters: settingFilters);
409+ _filterAndRefreshSearchMatches ();
410+ }
411+
379412 void _filterAndRefreshSearchMatches () {
380413 filterData (activeFilter.value);
381414 refreshSearchMatches ();
0 commit comments