runAsync<T> method Null safety

Future<T?> runAsync<T>(
  1. Future<T> callback(
      ),
    1. {Duration additionalTime = const Duration(milliseconds: 1000)}
    )

    Runs a callback that performs real asynchronous work.

    This is intended for callers who need to call asynchronous methods where the methods spawn isolates or OS threads and thus cannot be executed synchronously by calling pump.

    If callers were to run these types of asynchronous tasks directly in their test methods, they run the possibility of encountering deadlocks.

    If callback completes successfully, this will return the future returned by callback.

    If callback completes with an error, the error will be caught by the Flutter framework and made available via takeException, and this method will return a future that completes with null.

    Re-entrant calls to this method are not allowed; callers of this method are required to wait for the returned future to complete before calling this method again. Attempts to do otherwise will result in a TestFailure error being thrown.

    If your widget test hangs and you are using runAsync, chances are your code depends on the result of a task that did not complete. Fake async environment is unable to resolve a future that was created in runAsync. If you observe such behavior or flakiness, you have a number of options:

    • Consider restructuring your code so you do not need runAsync. This is the optimal solution as widget tests are designed to run in fake async environment.

    • Expose a Future in your application code that signals the readiness of your widget tree, then await that future inside callback.

    Implementation

    Future<T?> runAsync<T>(
      Future<T> Function() callback, {
      Duration additionalTime = const Duration(milliseconds: 1000),
    }) => binding.runAsync<T?>(callback, additionalTime: additionalTime);