blob: 23365494b9efc339e2c454088dbd4ab939bb7a90 [file] [log] [blame]
// Copyright 2017 The Fuchsia 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';
import 'model.dart';
export 'model.dart' show ScopedModel, Model, ScopedModelDescendant;
/// Base class for [Model]s that depend on a Ticker.
abstract class TickingModel extends Model {
Ticker _ticker;
Duration _lastTick;
/// Returns false if [_ticker] should stop ticking after this tick.
bool handleTick(double elapsedSeconds);
/// Starts the [_ticker].
void startTicking() {
if (_ticker?.isTicking ?? false) {
return;
}
if (handleTick(0.0)) {
_ticker = new Ticker(_onTick);
_lastTick = Duration.zero;
_ticker.start();
}
}
void _onTick(Duration elapsed) {
final double elapsedSeconds =
(elapsed.inMicroseconds - _lastTick.inMicroseconds) / 1000000.0;
_lastTick = elapsed;
bool continueTicking = handleTick(elapsedSeconds);
if (!continueTicking) {
_ticker?.dispose();
_ticker = null;
}
notifyListeners();
}
}