diff --git a/flutter-candidate.txt b/flutter-candidate.txt index d9bece0cf8c..135d4eeb61c 100644 --- a/flutter-candidate.txt +++ b/flutter-candidate.txt @@ -1 +1 @@ -b0e66e6dd81c20dae6a3ce2ee515a165dbbbfb3e +02a06a851ff3d25e353f5f33f46c47f179e70467 diff --git a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart index c6e56a3bbd3..251cfb64071 100644 --- a/packages/devtools_app/lib/src/framework/observer/_memory_web.dart +++ b/packages/devtools_app/lib/src/framework/observer/_memory_web.dart @@ -65,7 +65,8 @@ extension type _UserAgentSpecificMemoryBreakdownAttributionElement._(JSObject _) @JS() extension type _UserAgentSpecificMemoryBreakdownAttributionContainerElement._( JSObject _ -) implements JSObject { +) + implements JSObject { external String get id; external String get url; diff --git a/packages/devtools_app/test/service/timeline_streams_test.dart b/packages/devtools_app/test/service/timeline_streams_test.dart index 7c345297ab2..c51353c007c 100644 --- a/packages/devtools_app/test/service/timeline_streams_test.dart +++ b/packages/devtools_app/test/service/timeline_streams_test.dart @@ -22,30 +22,23 @@ void main() { await env.tearDownEnvironment(force: true); }); - test( - 'timeline streams initialized on vm service opened', - () async { - await env.setupEnvironment(); + test('timeline streams initialized on vm service opened', () async { + await env.setupEnvironment(); - // Await a short delay to make sure the timelineStreamManager is done - // initializing. - await delay(); + // Await a short delay to make sure the timelineStreamManager is done + // initializing. + await delay(); - expect(serviceConnection.serviceManager.service, equals(env.service)); - expect(serviceConnection.timelineStreamManager, isNotNull); - expect( - serviceConnection.timelineStreamManager.basicStreams, - isNotEmpty, - ); - expect( - serviceConnection.timelineStreamManager.advancedStreams, - isNotEmpty, - ); + expect(serviceConnection.serviceManager.service, equals(env.service)); + expect(serviceConnection.timelineStreamManager, isNotNull); + expect(serviceConnection.timelineStreamManager.basicStreams, isNotEmpty); + expect( + serviceConnection.timelineStreamManager.advancedStreams, + isNotEmpty, + ); - await env.tearDownEnvironment(); - }, - timeout: const Timeout.factor(4), - ); + await env.tearDownEnvironment(); + }, timeout: const Timeout.factor(4)); test('notifies on stream change', () async { await env.setupEnvironment(); diff --git a/packages/devtools_shared/CHANGELOG.md b/packages/devtools_shared/CHANGELOG.md index dd302466f21..0f1f770d1a9 100644 --- a/packages/devtools_shared/CHANGELOG.md +++ b/packages/devtools_shared/CHANGELOG.md @@ -3,6 +3,9 @@ Copyright 2025 The Flutter Authors Use of this source code is governed by a BSD-style license that can be found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. --> +# 13.0.1 +* Handle null values for `FlutterStore.flutterClientId`. + # 13.0.0 * **Breaking change:** Removed `DevToolsStoreKeys.analyticsEnabled` and `DevToolsStoreKeys.isFirstRun` since these were only used for legacy analytics. diff --git a/packages/devtools_shared/lib/src/server/flutter_store.dart b/packages/devtools_shared/lib/src/server/flutter_store.dart index 34410707b31..a45ebdae279 100644 --- a/packages/devtools_shared/lib/src/server/flutter_store.dart +++ b/packages/devtools_shared/lib/src/server/flutter_store.dart @@ -17,5 +17,6 @@ class FlutterStore { bool get gaEnabled => properties[gaEnabledKey] == true; - String get flutterClientId => properties[flutterClientIdKey] as String; + String get flutterClientId => + (properties[flutterClientIdKey] as String?) ?? ''; } diff --git a/packages/devtools_shared/lib/src/server/server_api.dart b/packages/devtools_shared/lib/src/server/server_api.dart index 4cc838a52ca..f9b50724845 100644 --- a/packages/devtools_shared/lib/src/server/server_api.dart +++ b/packages/devtools_shared/lib/src/server/server_api.dart @@ -68,13 +68,8 @@ class ServerApi { dtd, ); - // TODO(kenz): remove legacy analytics once the unified analytics rollout - // is complete and verified for robustness (est. Fall 2025). - // ----- Flutter Tool GA store. ----- case apiGetFlutterGAClientId: - // Flutter Tool GA clientId - ONLY get Flutter's clientId if enabled is - // true. return _encodeResponse( LocalFileSystem.flutterStoreExists() ? _flutterStore.flutterClientId diff --git a/packages/devtools_shared/pubspec.yaml b/packages/devtools_shared/pubspec.yaml index 286fefc2526..dce148c2109 100644 --- a/packages/devtools_shared/pubspec.yaml +++ b/packages/devtools_shared/pubspec.yaml @@ -4,7 +4,7 @@ name: devtools_shared description: Package of shared Dart structures between devtools_app, dds, and other tools. -version: 13.0.0 +version: 13.0.1 repository: https://github.com/flutter/devtools/tree/master/packages/devtools_shared diff --git a/packages/devtools_shared/test/server/persistent_properties_test.dart b/packages/devtools_shared/test/server/persistent_properties_test.dart index a1b667cc04c..8358e7a7c3d 100644 --- a/packages/devtools_shared/test/server/persistent_properties_test.dart +++ b/packages/devtools_shared/test/server/persistent_properties_test.dart @@ -15,7 +15,8 @@ void main() { const storeName = 'test_store'; setUp(() { - tempDir = Directory.systemTemp.createTempSync('persistent_properties_test'); + tempDir = + Directory.systemTemp.createTempSync('persistent_properties_test'); properties = IOPersistentProperties( storeName, documentDirPath: tempDir.path,