Fix type issue of the timelineEvents assignment (#28530)
This fixes https://github.com/flutter/flutter/issues/28374
The fact that json_rpc_2 is hiding exceptions like this might be a
bigger issue: https://github.com/flutter/flutter/issues/28531
Merge on red because add2app test is currently flaking out according to @dnfield
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index 545443e..9fe973e4a 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -620,7 +620,12 @@
_extensionKind = map['extensionKind'];
_extensionData = map['extensionData'];
}
- _timelineEvents = map['timelineEvents'];
+ // map['timelineEvents'] is List<dynamic> which can't be assigned to
+ // List<Map<String, dynamic>> directly. Unfortunately, we previously didn't
+ // catch this exception because json_rpc_2 is hiding all these exceptions
+ // on a Stream.
+ final List<dynamic> dynamicList = map['timelineEvents'];
+ _timelineEvents = dynamicList?.cast<Map<String, dynamic>>();
}
bool get isPauseEvent {
@@ -1293,7 +1298,8 @@
Future<bool> flutterAlreadyPaintedFirstUsefulFrame() async {
final Map<String, dynamic> result = await invokeFlutterExtensionRpcRaw('ext.flutter.didSendFirstFrameEvent');
- return result['enabled'] == 'true';
+ // result might be null when the service extension is not initialized
+ return result != null && result['enabled'] == 'true';
}
Future<Map<String, dynamic>> uiWindowScheduleFrame() {