diff --git a/packages/flutter/lib/src/scheduler/binding.dart b/packages/flutter/lib/src/scheduler/binding.dart index 2e47923621d..9dd261c7543 100644 --- a/packages/flutter/lib/src/scheduler/binding.dart +++ b/packages/flutter/lib/src/scheduler/binding.dart @@ -202,14 +202,10 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { if (!kReleaseMode) { int frameNumber = 0; - // 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); - } - }; + window.frameTimings.listen((FrameTiming frameTiming) { + frameNumber += 1; + _profileFramePostEvent(frameNumber, frameTiming); + }); } } diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index 8e708af423e..1ebed986f19 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, TimingsCallback; +import 'dart:ui' show AppLifecycleState, Locale, AccessibilityFeatures, FrameTiming; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -747,25 +747,13 @@ mixin WidgetsBinding on BindingBase, SchedulerBinding, GestureBinding, RendererB if (_needToReportFirstFrame && _reportFirstFrame) { assert(!_firstFrameCompleter.isCompleted); - // 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) { + WidgetsBinding.instance.window.frameTimings.first.then((FrameTiming _) { 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 8e4661ba410..a5f0ec2b958 100644 --- a/packages/flutter/test/foundation/service_extensions_test.dart +++ b/packages/flutter/test/foundation/service_extensions_test.dart @@ -79,12 +79,11 @@ class TestServiceExtensionsBinding extends BindingBase await flushMicrotasks(); if (ui.window.onDrawFrame != null) ui.window.onDrawFrame(); - // 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([]); + final Future firstFrameEventFired = window.frameTimings.first; + ui.window.debugReportTimings([ + ui.FrameTiming(List.filled(ui.FramePhase.values.length, 0)), + ]); + await firstFrameEventFired; } @override diff --git a/packages/flutter/test/scheduler/scheduler_test.dart b/packages/flutter/test/scheduler/scheduler_test.dart index c62fcf8dacd..8beeab577d5 100644 --- a/packages/flutter/test/scheduler/scheduler_test.dart +++ b/packages/flutter/test/scheduler/scheduler_test.dart @@ -132,15 +132,18 @@ void main() { }); test('Flutter.Frame event fired', () async { - // use frameTimings. https://github.com/flutter/flutter/issues/38838 - // ignore: deprecated_member_use - window.onReportTimings([FrameTiming([ + // We can't use Future in scheduler_test so we'll use dynamic instead. + final dynamic firstFrameEventFired = window.frameTimings.first; + + window.debugReportTimings([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 1a8dc5d2b86..1f4a99d4bc9 100644 --- a/packages/flutter_test/lib/src/window.dart +++ b/packages/flutter_test/lib/src/window.dart @@ -286,15 +286,7 @@ class TestWindow implements Window { } @override - // 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; - } + Stream get frameTimings => _window.frameTimings; @override PointerDataPacketCallback get onPointerDataPacket => _window.onPointerDataPacket;