ポーリング処理をスマートに管理。「pulling_manager」でFlutterの非同期ロジックを整える

アプリ開発をしていると、一定間隔でサーバーの状態を確認したい(ポーリングしたい)場面に遭遇します。

例えば、

  • チャットメッセージの新着チェック
  • バッチ処理の完了待ち
  • 支払いステータスの確認

こういったケースで手動でTimerFuture.delayedを組むのは面倒ですし、メモリリークや重複リクエストのリスクもあります。

そこで今回は、ポーリング処理を簡潔・安全に管理できるFlutterパッケージ「pulling_manager」を紹介します。


pulling_managerとは?

pulling_managerは、一定間隔で非同期処理(API呼び出しなど)を実行するポーリングロジックを簡単に構築できるユーティリティです。

特徴:

  • ポーリング開始・停止を明示的に制御できる
  • 例外処理やキャンセル処理に対応
  • 複数ポーリングを同時管理可能
  • Widgetと連動せずにバックグラウンド処理としても利用可能

インストール方法

まずは pubspec.yaml に追加:

dependencies:
  pulling_manager: ^1.0.2  # 最新バージョンはpub.devで確認

その後 flutter pub get を実行します。


基本的な使い方

1. PullingManagerを作成

final manager = PullingManager(
  duration: Duration(seconds: 5),
  onTick: () async {
    // ここにポーリングしたい非同期処理を書く
    final result = await fetchStatus();
    print('ステータス確認結果: $result');
  },
);

2. ポーリングの開始と停止

// 開始
manager.start();

// 停止
manager.stop();

必要なタイミングで手動で開始・停止ができるのがポイントです。


状態に応じて動的に制御する例

例えば、ある条件を満たしたらポーリングを停止する場合:

PullingManager(
  duration: Duration(seconds: 3),
  onTick: () async {
    final status = await checkJobStatus();
    if (status == 'completed') {
      manager.stop();
      print('ジョブ完了、ポーリング停止');
    }
  },
);

非同期処理の中で状態を見て自己停止できるのが便利です。


UIと連携して使う例(StatefulWidget)

late PullingManager _manager;

@override
void initState() {
  super.initState();
  _manager = PullingManager(
    duration: Duration(seconds: 10),
    onTick: () async {
      final result = await fetchUpdates();
      setState(() {
        _latestData = result;
      });
    },
  );
  _manager.start();
}

@override
void dispose() {
  _manager.stop();
  super.dispose();
}

このように、ライフサイクルに組み込んでポーリングを管理することができます。


応用:複数のポーリングを同時に使う

例えば2つのAPIを並行してポーリングしたい場合:

final manager1 = PullingManager(...);
final manager2 = PullingManager(...);

manager1.start();
manager2.start();

それぞれ独立した間隔や処理内容で制御可能です。


エラー処理もシンプル

非同期処理中に例外が発生した場合も、try-catchでハンドリングできます。

onTick: () async {
  try {
    await fetchData();
  } catch (e) {
    print('エラーが発生: $e');
  }
}

アプリが落ちることなく安定して動作します。


まとめ

ポーリング処理は、地味ながらアプリの品質を左右する重要な機能です。

pulling_managerを使えば、

  • TimerやFutureを手動で管理しなくていい
  • 開始・停止を明確にコントロール
  • Dartらしい非同期コードが書ける

といったメリットがあり、安全でメンテナブルなポーリング処理が実現できます

非同期の定期処理に課題を感じている方は、ぜひ一度導入を検討してみてください。

タイトルとURLをコピーしました