setState() will call scheduleFrame() in post-frame callback now. (#56968)

This commit is contained in:
snyiuan
2020-05-14 00:37:02 +08:00
committed by GitHub
parent 3ccb160da3
commit 610dc170d9
2 changed files with 11 additions and 6 deletions

View File

@@ -83,11 +83,7 @@ class _SemanticsDebuggerState extends State<SemanticsDebugger> with WidgetsBindi
SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) {
// Semantic information are only available at the end of a frame and our
// only chance to paint them on the screen is the next frame. To achieve
// this, we call setState() in a post-frame callback. THIS PATTERN SHOULD
// NOT BE COPIED. Calling setState() in a post-frame callback is a bad
// idea as it will not schedule a frame and your app may be lagging behind
// by one frame. We manually call scheduleFrame() to force a frame and
// ensure that the semantic information are always painted on the screen.
// this, we call setState() in a post-frame callback.
if (mounted) {
// If we got disposed this frame, we will still get an update,
// because the inactive list is flushed after the semantics updates
@@ -95,7 +91,6 @@ class _SemanticsDebuggerState extends State<SemanticsDebugger> with WidgetsBindi
setState(() {
// The generation of the _SemanticsDebuggerListener has changed.
});
SchedulerBinding.instance.scheduleFrame();
}
});
}

View File

@@ -10,6 +10,16 @@ import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('SemanticsDebugger will schedule a frame', (WidgetTester tester) async {
await tester.pumpWidget(
SemanticsDebugger(
child: Container(),
),
);
expect(tester.binding.hasScheduledFrame, isTrue);
});
testWidgets('SemanticsDebugger smoke test', (WidgetTester tester) async {
// This is a smoketest to verify that adding a debugger doesn't crash.