Written by Anonymous

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// current code
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

@override
Widget build(BuildContext context) {
   return Column(
     children: [
       Button(
         onPressed: () => myFunction();
       )
     ]
   );
}

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// new code
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

Future<ReceivePort> makeIsolate() async {
  ReceivePort receivePort = ReceivePort();
  Isolate isolate = await Isolate.spawn(
    isolateFunction,
    receivePort.sendPort,
  );
  return receivePort;
}

void isolateFunction(SendPort sendPort) async {
  //Do long running task
  for (int i = 0; i < 100000; i++) {
    doSth();

    double progress = i/100000; // Calculating progress based on loop index
    sendPort.send(progress);
  }
  sendPort.send(true); // Send true on completion to indicate work is done
}

Stream<double> progress() async* {
    ReceivePort receivePort = await makeIsolate();
    await for(var event in receivePort) {
      if(event is double) {
        yield event;
      }
      if(event is bool) {
        receivePort.close();
        return;
      }
    }
  }

@override
Widget build(BuildContext context) {
   return Column(
     children: [
       Button(
         onPressed: () => myFunction();
       ),
       StreamBuilder(
         stream: progress(),
         builder: (context, snapshot) {
           if(snapshot.connectionState == ConnectionState.done) {
             //show successful completion here
           }
           if(snapshot.hasData) {
             return CircularProgressIndicator(
             value: snapshot.data,
           );
          }
          return CircularProgressIndicator();
         }
       )
     ]
   );
}
Notepad
Select All