| // Copyright 2024 The Flutter Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. |
| |
| import 'dart:async'; |
| |
| extension CompleterExtension<T> on Completer<T> { |
| /// Completes this completer with optional [value] only if it has not already |
| /// been completed. |
| /// |
| /// If the completer has already been completed, [orElse] will be called if it |
| /// is not null, |
| void safeComplete([T? value, void Function()? orElse]) { |
| if (!isCompleted) { |
| complete(value); |
| } else { |
| orElse?.call(); |
| } |
| } |
| |
| /// Completes this completer with [error] and an optional [stackTrace] only if |
| /// it has not already been completed. |
| void safeCompleteError(Object error, [StackTrace? stackTrace]) { |
| if (!isCompleted) { |
| completeError(error, stackTrace); |
| } |
| } |
| } |