blob: b380927ae3b7068299a18018df23b05196782214 [file] [log] [blame]
// Copyright 2018 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import 'dart:async';
import 'clock.dart';
/// The key for the [Zone] value that controls the current implementation of
/// [clock].
final _clockKey = new Object();
/// The key for the [Zone] value that controls whether nested zones can override
/// [clock].
final _isFinalKey = new Object();
/// The default implementation of [clock] for the current [Zone].
///
/// This defaults to the system clock. It can be set within a zone using
/// [withClock].
Clock get clock => Zone.current[_clockKey] ?? const Clock();
/// Runs [callback] with the given value for the top-level [clock] field.
///
/// This is [Zone]-scoped, so asynchronous callbacks spawned within [callback]
/// will also use the new value for [clock].
///
/// If [isFinal] is `true`, calls to [withClock] within [callback] will throw a
/// [StateError]. However, this parameter is deprecated and should be avoided.
T withClock<T>(Clock clock, T callback(), {@deprecated bool isFinal: false}) {
if (Zone.current[_isFinalKey] ?? false) {
throw new StateError(
"Cannot call withClock() within a call to withClock(isFinal: true).");
}
return runZoned(callback,
zoneValues: {_clockKey: clock, _isFinalKey: isFinal});
}