diff --git a/packages/flutter/lib/src/scheduler/binding.dart b/packages/flutter/lib/src/scheduler/binding.dart index 9dd261c754..2e47923621 100644 --- a/packages/flutter/lib/src/scheduler/binding.dart +++ b/packages/flutter/lib/src/scheduler/binding.dart @@ -202,10 +202,14 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { if (!kReleaseMode) { int frameNumber = 0; - window.frameTimings.listen((FrameTiming frameTiming) { - frameNumber += 1; - _profileFramePostEvent(frameNumber, frameTiming); - }); + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + window.onReportTimings = (List timings) { + for (FrameTiming frameTiming in timings) { + frameNumber += 1; + _profileFramePostEvent(frameNumber, frameTiming); + } + }; } } diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index 1ebed986f1..8e708af423 100644 --- a/packages/flutter/lib/src/widgets/binding.dart +++ b/packages/flutter/lib/src/widgets/binding.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'dart:developer' as developer; -import 'dart:ui' show AppLifecycleState, Locale, AccessibilityFeatures, FrameTiming; +import 'dart:ui' show AppLifecycleState, Locale, AccessibilityFeatures, FrameTiming, TimingsCallback; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -747,13 +747,25 @@ mixin WidgetsBinding on BindingBase, SchedulerBinding, GestureBinding, RendererB if (_needToReportFirstFrame && _reportFirstFrame) { assert(!_firstFrameCompleter.isCompleted); - WidgetsBinding.instance.window.frameTimings.first.then((FrameTiming _) { + // TODO(liyuqian): use a broadcast stream approach + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + final TimingsCallback oldCallback = WidgetsBinding.instance.window.onReportTimings; + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + WidgetsBinding.instance.window.onReportTimings = (List timings) { if (!kReleaseMode) { developer.Timeline.instantSync('Rasterized first useful frame'); developer.postEvent('Flutter.FirstFrame', {}); } + if (oldCallback != null) { + oldCallback(timings); + } + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + WidgetsBinding.instance.window.onReportTimings = oldCallback; _firstFrameCompleter.complete(); - }); + }; } try { diff --git a/packages/flutter/test/foundation/service_extensions_test.dart b/packages/flutter/test/foundation/service_extensions_test.dart index a5f0ec2b95..8e4661ba41 100644 --- a/packages/flutter/test/foundation/service_extensions_test.dart +++ b/packages/flutter/test/foundation/service_extensions_test.dart @@ -79,11 +79,12 @@ class TestServiceExtensionsBinding extends BindingBase await flushMicrotasks(); if (ui.window.onDrawFrame != null) ui.window.onDrawFrame(); - final Future firstFrameEventFired = window.frameTimings.first; - ui.window.debugReportTimings([ - ui.FrameTiming(List.filled(ui.FramePhase.values.length, 0)), - ]); - await firstFrameEventFired; + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + if (ui.window.onReportTimings != null) + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + ui.window.onReportTimings([]); } @override diff --git a/packages/flutter/test/scheduler/scheduler_test.dart b/packages/flutter/test/scheduler/scheduler_test.dart index 8beeab577d..c62fcf8dac 100644 --- a/packages/flutter/test/scheduler/scheduler_test.dart +++ b/packages/flutter/test/scheduler/scheduler_test.dart @@ -132,18 +132,15 @@ void main() { }); test('Flutter.Frame event fired', () async { - // We can't use Future in scheduler_test so we'll use dynamic instead. - final dynamic firstFrameEventFired = window.frameTimings.first; - - window.debugReportTimings([FrameTiming([ + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + window.onReportTimings([FrameTiming([ // build start, build finish 10000, 15000, // raster start, raster finish 16000, 20000, ])]); - await firstFrameEventFired; - final List> events = scheduler.getEventsDispatched('Flutter.Frame'); expect(events, hasLength(1)); diff --git a/packages/flutter_test/lib/src/window.dart b/packages/flutter_test/lib/src/window.dart index 1f4a99d4bc..1a8dc5d2b8 100644 --- a/packages/flutter_test/lib/src/window.dart +++ b/packages/flutter_test/lib/src/window.dart @@ -286,7 +286,15 @@ class TestWindow implements Window { } @override - Stream get frameTimings => _window.frameTimings; + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + TimingsCallback get onReportTimings => _window.onReportTimings; + @override + set onReportTimings(TimingsCallback callback) { + // use frameTimings. https://github.com/flutter/flutter/issues/38838 + // ignore: deprecated_member_use + _window.onReportTimings = callback; + } @override PointerDataPacketCallback get onPointerDataPacket => _window.onPointerDataPacket;