Flutter的代碼都是默認跑在root isolate上的,那麼Flutter中能不能本身建立一個isolate呢?固然能夠!,接下來咱們就本身建立一個isolate!bash
有關isolate的代碼,都在isolate.dart
文件中,裏面有一個生成isolate的方法:異步
external static Future<Isolate> spawn<T>(
void entryPoint(T message), T message,
{bool paused: false,
bool errorsAreFatal,
SendPort onExit,
SendPort onError});
複製代碼
spawn
方法,必傳參數有兩個,函數entryPoint和參數message,其中async
函數函數
函數必須是頂級函數或靜態方法oop
參數ui
參數裏必須包含SendPort
spa
建立的步驟,寫在代碼的註釋裏code
import 'dart:async';
import 'dart:io';
import 'dart:isolate';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
//一個普普統統的Flutter應用的入口
//main函數這裏有async關鍵字,是由於建立的isolate是異步的
void main() async{
runApp(MyApp());
//asyncFibonacci函數裏會建立一個isolate,並返回運行結果
print(await asyncFibonacci(20));
}
//這裏以計算斐波那契數列爲例,返回的值是Future,由於是異步的
Future<dynamic> asyncFibonacci(int n) async{
//首先建立一個ReceivePort,爲何要建立這個?
//由於建立isolate所需的參數,必需要有SendPort,SendPort須要ReceivePort來建立
final response = new ReceivePort();
//開始建立isolate,Isolate.spawn函數是isolate.dart裏的代碼,_isolate是咱們本身實現的函數
//_isolate是建立isolate必需要的參數。
await Isolate.spawn(_isolate,response.sendPort);
//獲取sendPort來發送數據
final sendPort = await response.first as SendPort;
//接收消息的ReceivePort
final answer = new ReceivePort();
//發送數據
sendPort.send([n,answer.sendPort]);
//得到數據並返回
return answer.first;
}
//建立isolate必需要的參數
void _isolate(SendPort initialReplyTo){
final port = new ReceivePort();
//綁定
initialReplyTo.send(port.sendPort);
//監聽
port.listen((message){
//獲取數據並解析
final data = message[0] as int;
final send = message[1] as SendPort;
//返回結果
send.send(syncFibonacci(data));
});
}
int syncFibonacci(int n){
return n < 2 ? n : syncFibonacci(n-2) + syncFibonacci(n-1);
}
複製代碼
直接運行程序就會在log裏看到以下的打印:事件
flutter: 6765
複製代碼
說了這麼久,爲何要建立本身的isolate?有什麼用?ci
由於Root isolate會負責渲染,還有UI交互,若是咱們有一個很耗時的操做呢?前面知道isolate裏是一個event loop(事件循環),若是一個很耗時的task一直在運行,那麼後面的UI操做都被阻塞了,因此若是咱們有耗時的操做,就應該放在isolate裏!