compute関数内でグローバル変数を使うとうまく動作しないことに気づきました。
import 'package:flutter/foundation.dart';
int globalint = 0;
void main() async {
print('main1 globalint ' + globalint.toString());
globalint = 10;
await callBinderInBackground();
print('main2 globalint ' + globalint.toString());
}
void performCall(String param) {
print('performCall1 globalint ' + globalint.toString());
globalint = globalint + 1;
print('performCall2 globalint ' + globalint.toString());
}
Future callBinderInBackground() async {
print('callBinderInBackground start');
await compute(performCall, "prm");
}
試しに上のコードを動作させてみたところ次のような結果が
flutter: main1 globalint 0
flutter: callBinderInBackground start
flutter: performCall1 globalint 0
flutter: performCall2 globalint 1
flutter: main2 globalint 10
compute関数内の処理にグローバル変数を介して値を渡すことはできないようです。
以下GTP先生からの回答
Flutter の compute 関数は、新しいアイソレート(isolate)を作成して非同期処理を実行するためのものです。アイソレートはメモリを共有しないため、グローバル変数の値が compute 関数内で変更されない、または予期せぬ値を持つといった問題が発生することがあります。
理由
Flutterの compute 関数は、新しいアイソレートを生成します。各アイソレートはメモリ空間を独立して持っており、別々のアイソレート間でデータを共有することはできません。したがって、メインアイソレートで定義されたグローバル変数は、 compute 関数で生成されたアイソレートからは直接アクセスできません。
compute関数内の処理との値の受け渡しは、引数/戻り値で行う必要があるようです。