• Ian Hickson's avatar
    Flush microtasks after transient callbacks are run. (#9702) · e8c46927
    Ian Hickson authored
    This splits the frame pipeline into two, beginFrame and drawFrame.
    
    As part of making this change I added some debugging hooks that helped
    debug the issues that came up:
    
     * I added debugPrintScheduleFrameStacks which prints a stack whenever
       a frame is actually scheduled, so you can see why frames are being
       scheduled.
    
     * I added some toString output to EditableText and RawKeyboardListener.
    
     * I added a scheduler_tester.dart library for scheduler library tests.
    
     * I changed the test framework to flush microtasks before pumping.
    
     * Some asserts that had the old string literal form were replaced by
       asserts with messages.
    
    I also fixed a few subtle bugs that this uncovered:
    
     * setState() now calls `ensureVisualUpdate`, rather than
       `scheduleFrame`. This means that calling it from an
       AnimationController callback does not actually schedule an extra
       redundant frame as it used to.
    
     * I corrected some documentation.
    e8c46927
scheduler_tester.dart 609 Bytes
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/scheduler.dart';

@Deprecated('animation_tester is not compatible with dart:async')
class Future { } // so that people can't import us and dart:async

void tick(Duration duration) {
  // We don't bother running microtasks between these two calls
  // because we don't use Futures in these tests and so don't care.
  SchedulerBinding.instance.handleBeginFrame(duration);
  SchedulerBinding.instance.handleDrawFrame();
}