アプリ開発をしていると、一定間隔でサーバーの状態を確認したい(ポーリングしたい)場面に遭遇します。
例えば、
- チャットメッセージの新着チェック
- バッチ処理の完了待ち
- 支払いステータスの確認
こういったケースで手動でTimer
やFuture.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らしい非同期コードが書ける
といったメリットがあり、安全でメンテナブルなポーリング処理が実現できます。
非同期の定期処理に課題を感じている方は、ぜひ一度導入を検討してみてください。