4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flutter Rust Coreを使った(続)通知モーダルのミューテックス排他制御

Last updated at Posted at 2024-07-05

これは焼き直しです

以前、通知モーダルのミューテックス排他制御の記事を書きましたが、そのときは自前?でMutexを用意していました。

この度めでたく『Rust Core 1.0』がリリースされたことを受けて、Rustには標準でMutexの仕組みが備わっていることもあり、早速使ってみました。

注意として、上記パッケージはRustの機能をDart言語で実装したものであって、DartからRustを呼び出すffiというわけではありません。

解決したいこと

連続で表示する通知モーダルの排他制御です。

詳しくは前回の記事を読んでください

Rust Coreで修正する

まず公式ドキュメントにしたがってパッケージを導入します。

flutter pub add rust_core

あとは手順としては前回の記事と同じです。
rust_coreパッケージ(のsync)をimportした上で、排他制御ごとのサービスプロバイダーを定義します。

mutex_service.dart
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句でのロックの解放
がパッケージ側で実装済みなので使うだけです。

notification.dart
  //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)); 
    });

結論

前回よりももっとシンプルに実装できました:tada:

最後に宣伝

CBcloudではモバイルエンジニア募集中です!

沖縄では隔月(場合によっては3ヶ月に一度)でFlutterコミュニティ活動をしています!
旅行ついでに立ち寄ってみてください:airplane::airplane:

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?