[Flutter/dart] flutter_isolateの使い方
概要
操作を軽快にするために重い処理を別の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は何をしているのか)
最新記事
すべて表示現象 アプリ内にAdmobを追加して、アプリを起動すると、下記のエラーが発生 java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider 原因 AndroidManifestの書き方が誤っていた。 <meta-data>はactivityと同じ階層にある必要が
概要 Uriを持っていて、Urlに変換したい場合の方法で少し手惑ったので共有します 方法 String url = uri.toString(); これだけです。 最後に ページを開くだけだとUriでもUrlでもいいんですが、WebViewはUrlを要求してくるんですよね。
問題 以前、日本語を含むURLを開くためには、エンコーディングしてやる必要がある、という記事を書きました。 しかし、すでにエンコーディングされているURLを再度エンコーディングしてしまうと、別のURLになってしまいます。 つまり、URLを開く処理の前に、 ・エンコーディングが必要なURLか ・すでにエンコーディングがされているか を判定しないといけないことになります。これは中々煩雑な処理です。 発