flutter_request_scheduler 1.0.1
flutter_request_scheduler: ^1.0.1 copied to clipboard
Production-ready request scheduler for Flutter/Dart. Controls concurrency, queues, prioritizes, deduplicates, retries, and debounces API calls to prevent UI lag, frame drops, and freezing under heavy [...]
example/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_request_scheduler/flutter_request_scheduler.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) => MaterialApp(
home: RequestSchedulerDemo(),
);
}
class RequestSchedulerDemo extends StatefulWidget {
@override
State<RequestSchedulerDemo> createState() => _RequestSchedulerDemoState();
}
class _RequestSchedulerDemoState extends State<RequestSchedulerDemo> {
final lb = RequestScheduler(maxConcurrent: 4, enableLogging: true);
int _completed = 0;
Future<String> _mockApiCall(int id) async {
await Future.delayed(Duration(milliseconds: 300 + id * 50));
return 'Result $id';
}
void _fireHeavyLoad() {
for (int i = 0; i < 30; i++) {
lb.schedule(
() => _mockApiCall(i),
priority: i % 5 == 0 ? Priority.high : Priority.normal,
deduplicationKey: i < 10 ? 'dedup_$i' : null,
).future.then((_) {
setState(() => _completed++);
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('flutter_request_scheduler Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Completed: $_completed', style: Theme.of(context).textTheme.headlineMedium),
const SizedBox(height: 40),
ElevatedButton(
onPressed: _fireHeavyLoad,
child: const Text('FIRE 30 API CALLS'),
),
const SizedBox(height: 20),
Text('Metrics:\n${lb.metrics}'),
],
),
),
);
}
@override
void dispose() {
lb.dispose();
super.dispose();
}
}