compute top-level constant Null safety

ComputeImpl const compute

A function that spawns an isolate and runs the provided callback on that isolate, passes it the provided message, and (eventually) returns the value returned by callback.

This is useful for operations that take longer than a few milliseconds, and which would therefore risk skipping frames. For tasks that will only take a few milliseconds, consider SchedulerBinding.scheduleTask instead.

The following code uses the compute function to check whether a given integer is a prime number.
Future<bool> isPrime(int value) {
  return compute(_calculate, value);

bool _calculate(int value) {
  if (value == 1) {
    return false;
  for (int i = 2; i < value; ++i) {
    if (value % i == 0) {
      return false;
  return true;

The function used as callback must be one that can be sent to an isolate. Qualifying functions include:

  • top-level functions
  • static methods
  • closures that only capture objects that can be sent to an isolate

Using closures must be done with care. Due to dart-lang/sdk#36983 a closure may capture objects that, while not directly used in the closure itself, may prevent it from being sent to an isolate.

The compute method accepts the following parameters:

  • Q is the type of the message that kicks off the computation.
  • R is the type of the value returned.

There are limitations on the values that can be sent and received to and from isolates. These limitations constrain the values of Q and R that are possible. See the discussion at SendPort.send.

The same limitations apply to any errors generated by the computation.

See also:


const ComputeImpl compute = isolates.compute;