これは焼き直しです
以前、通知モーダルのミューテックス排他制御の記事を書きましたが、そのときは自前?でMutexを用意していました。
この度めでたく『Rust Core 1.0』がリリースされたことを受けて、Rustには標準でMutexの仕組みが備わっていることもあり、早速使ってみました。
注意として、上記パッケージはRustの機能をDart言語で実装したものであって、DartからRustを呼び出すffiというわけではありません。
解決したいこと
連続で表示する通知モーダルの排他制御です。
詳しくは前回の記事を読んでください
Rust Coreで修正する
まず公式ドキュメントにしたがってパッケージを導入します。
flutter pub add rust_core
あとは手順としては前回の記事と同じです。
rust_coreパッケージ(のsync)をimportした上で、排他制御ごとのサービスプロバイダーを定義します。
import 'package:flutter_riverpod/flutter_riverpod.dart';
//rust_coreパッケージを使う
import 'package:rust_core/sync.dart';
//以下は前回記事と一緒
//排他制御をするグループ単位のProvider
final mutexServiceProvider =
Provider.family((ref, MutexGroupKey key) => Mutex());
//グループのキー
enum MutexGroupKey { notifyModal }
パッケージが変われば使用方法も変わるということで、今回はRust CoreのMutex
クラスのwithLock
メソッド使います。
withLock
メソッドには、そのコードを見れば分かる通り、
(a)タスク実行前のロックの取得
(b)try
句でのタスクの実行
(c)finally
句でのロックの解放
がパッケージ側で実装済みなので使うだけです。
//rust_coreパッケージを使う
import 'package:rust_core/sync.dart';
//この辺は前回記事と一緒
final _mutexGroupKey = MutexGroupKey.notifyModal;
final _mutexService = ref.read(mutexServiceProvider(_mutexGroupKey));
//通知が来たときに実行する関数
Future<void> _handleMessage(RemoteMessage message) async {
//ロックの取得&解放は実装済みなので、withLock呼ぶだけ
await _mutexService.withLock(() async {
//ミューテック対象としたいタスク(本例はモーダルボトムシート表示)
await showBarModalBottomSheet(ModalArguments(message));
});
結論
前回よりももっとシンプルに実装できました
最後に宣伝
CBcloudではモバイルエンジニア募集中です!
沖縄では隔月(場合によっては3ヶ月に一度)でFlutterコミュニティ活動をしています!
旅行ついでに立ち寄ってみてください