[Flutter/dart] flutter_isolateの使い方
- M.R

- 2020年12月21日
- 読了時間: 2分
更新日:2020年12月28日
概要
操作を軽快にするために重い処理を別のisolateで走らせたいことがあります。基本的にはcomputeメソッドを使えばいいのですが、android、iosの各platform固有のコードを利用する処理の場合はcompute関数は使えません。具体例としては、local_notification(通知)を作成したり、位置情報を取得したりといった処理です。どうもmain isolate以外からplatform channelでmessageを送れないようです。(こちらを参照)
じゃあそういう場合は諦めるのかというとそんなことありません。flutter_isolateというライブラリを用いれば別isolateで処理を行えます。
使い方
ますはpubsec.yamlに以下を追加し、ライブラリをインストール
dependencies:
flutter_isolate: ^1.0.0+14ライブラリをimport
import 'package:flutter_isolate/flutter_isolate.dart';重たい処理を定義(説明用に簡単な関数ですが、実際はplatform channelを使う処理)
static Future<void> heavy_method(int num) async{
//何か重い処理
}ここで注意しなければいけないのは、メソッドはstaticである必要があることと、引数はint、stringなどの基本的な(?)型のものを1つしかとれないこと。複数の引数やインスタンスメンバを引数にとりたい場合はjson形式にして渡します。(前回を参照)
FlutterIsolate.spawn()の第1引数に重たいメソッドを、第2引数にそのメソッドの引数を渡します。
final isolate=await FlutterIsolate.spawn(heavy_method, 1);
たったこれだけ!実に簡単!
最後に
flutter_isolate自体は簡単に使えるので、難しいのはメソッドの引数を頑張って1つにすることですね。特にplatform channelを使う場合は使う要素も多くなりますし、サードパーティ製の変数とかも要るとなると大変かも、、、
僕の場合はlocal_notificationでたくさんの通知を作るという処理でしたが、変数の生成はできるかぎりstaticにして別isolate内で行いました。
それにしてもこのライブラリ中身はどうなってるんだろ。時間が合ったら勉強してみよう。
(← 2020/12/28追記 中身を調べてみました flutter_isolateは何をしているのか)






コメント