ミッドランドブログ

長めのお知らせ、紹介記事を掲載します

【Flutter】compute関数内ではグローバル変数が使えない話

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関数内の処理との値の受け渡しは、引数/戻り値で行う必要があるようです。