Use a Duration for batching delay
diff --git a/example/ga.dart b/example/ga.dart
index 3526fc3..e160ad6 100644
--- a/example/ga.dart
+++ b/example/ga.dart
@@ -8,7 +8,7 @@
 import 'package:usage/usage_io.dart';
 
 void main(List args) async {
-  final defaultUA = 'UA-55029513-1';
+  final defaultUA = 'UA-188575324-1';
 
   if (args.isEmpty) {
     print('usage: dart ga <GA tracking ID>');
@@ -27,6 +27,8 @@
       .sendException('foo error:\n${sanitizeStacktrace(StackTrace.current)}');
   await ga.sendTiming('writeDuration', 123);
   await ga.sendEvent('create', 'consoleapp', label: 'Console App');
+  await ga.sendEvent('destroy', 'consoleapp', label: 'Console App');
+
   print('pinged ${ua}');
 
   await ga.waitForLastPing();
diff --git a/lib/src/usage_impl.dart b/lib/src/usage_impl.dart
index 872e481..f3939b9 100644
--- a/lib/src/usage_impl.dart
+++ b/lib/src/usage_impl.dart
@@ -6,8 +6,6 @@
 import 'dart:collection';
 import 'dart:math' as math;
 
-import 'package:pedantic/pedantic.dart';
-
 import '../usage.dart';
 import '../uuid/uuid.dart';
 
@@ -81,7 +79,7 @@
   @override
   AnalyticsOpt analyticsOpt = AnalyticsOpt.optOut;
 
-  late Future<void>? Function() _batchingDelay;
+  late Duration _batchingDelay;
   final Queue<String> _batchedEvents = Queue<String>();
   bool _isSendingScheduled = false;
 
@@ -99,14 +97,14 @@
     this.applicationVersion,
     String? analyticsUrl,
     String? analyticsBatchingUrl,
-    Future<void>? Function()? batchingDelay,
+    Duration? batchingDelay,
   }) {
     if (applicationName != null) setSessionValue('an', applicationName);
     if (applicationVersion != null) setSessionValue('av', applicationVersion);
 
     _url = analyticsUrl ?? _defaultAnalyticsUrl;
     _batchingUrl = analyticsBatchingUrl ?? _defaultAnalyticsBatchingUrl;
-    _batchingDelay = batchingDelay ?? () => Future(() {});
+    _batchingDelay = batchingDelay ?? const Duration();
   }
 
   bool? _firstRun;
@@ -272,16 +270,12 @@
     _batchedEvents.add(postHandler.encodeHit(eventArgs));
 
     if (!_isSendingScheduled) {
-      final delay = _batchingDelay();
-      if (delay == null) {
+      _isSendingScheduled = true;
+      // ignore: unawaited_futures
+      Future.delayed(_batchingDelay).then((value) {
+        _isSendingScheduled = false;
         _trySendBatches(completer);
-      } else {
-        _isSendingScheduled = true;
-        unawaited(delay.then((value) {
-          _isSendingScheduled = false;
-          _trySendBatches(completer);
-        }));
-      }
+      });
     }
     return completer.future;
   }
diff --git a/lib/src/usage_impl_html.dart b/lib/src/usage_impl_html.dart
index 97c2567..b2501aa 100644
--- a/lib/src/usage_impl_html.dart
+++ b/lib/src/usage_impl_html.dart
@@ -24,7 +24,7 @@
     String applicationName,
     String applicationVersion, {
     String? analyticsUrl,
-    Future<void>? Function()? batchingDelay,
+    Duration? batchingDelay,
   }) : super(
           trackingId,
           HtmlPersistentProperties(applicationName),
diff --git a/lib/src/usage_impl_io.dart b/lib/src/usage_impl_io.dart
index 800d591..f4d257a 100644
--- a/lib/src/usage_impl_io.dart
+++ b/lib/src/usage_impl_io.dart
@@ -26,12 +26,10 @@
 /// be supplied. For Flutter applications, you should pass in a value like
 /// `PathProvider.getApplicationDocumentsDirectory()`.
 ///
-/// [batchingDelay] is used to control batching behaviour. It should return a
-/// [Future] that will be awaited before attempting sending the enqueued
-/// messages. The default [batchingDelay] is `() => Future(() {})`. That implies
-/// messages will be sent whem control returns to the event loop.
-///
-/// If [batchingDelay] returns `null`, events will not be batched.
+/// [batchingDelay] is used to control batching behaviour. Events will be sent
+/// batches of 20 after the duration is over from when the first message was
+/// sent. The default is 0 milliseconds, meaning that messages will be sent when
+/// control returns to the event loop.
 ///
 /// Batched messages are sent in batches of up to 20 messages. They will be sent
 /// to [analyticsBatchingUrl] defaulting to
@@ -45,7 +43,7 @@
     String? analyticsBatchingUrl,
     Directory? documentDirectory,
     HttpClient? client,
-    Future<void>? Function()? batchingDelay,
+    Duration? batchingDelay,
   }) : super(
           trackingId,
           IOPersistentProperties(applicationName,
diff --git a/pubspec.yaml b/pubspec.yaml
index 6e51cfe..42b2e18 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,8 +11,8 @@
   sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
-  pedantic: ^1.9.0
   path: ^1.8.0
 
 dev_dependencies:
+  pedantic: ^1.9.0
   test: ^1.16.0-nullsafety
diff --git a/test/usage_impl_io_test.dart b/test/usage_impl_io_test.dart
index ea4535e..65f6708 100644
--- a/test/usage_impl_io_test.dart
+++ b/test/usage_impl_io_test.dart
@@ -59,30 +59,6 @@
   });
 
   group('batching', () {
-    test('With batch-delay returning null sends all events individually',
-        () async {
-      final mockClient = MockHttpClient();
-
-      final analytics = AnalyticsIO('<TRACKING-ID', 'usage-test', '0.0.1',
-          client: mockClient, batchingDelay: () => null);
-      unawaited(analytics.sendEvent('my-event1', 'something'));
-      unawaited(analytics.sendEvent('my-event2', 'something'));
-      unawaited(analytics.sendEvent('my-event3', 'something'));
-      await analytics.waitForLastPing();
-      analytics.close();
-      expect(mockClient.requests.length, 3);
-      final clientId = analytics.clientId;
-      expect(mockClient.requests[0].buffer.toString(), '''
-Request to https://www.google-analytics.com/collect with ${createUserAgent()}
-ec=my-event1&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event''');
-      expect(mockClient.requests[1].buffer.toString(), '''
-Request to https://www.google-analytics.com/collect with ${createUserAgent()}
-ec=my-event2&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event''');
-      expect(mockClient.requests[2].buffer.toString(), '''
-Request to https://www.google-analytics.com/collect with ${createUserAgent()}
-ec=my-event3&ea=something&an=usage-test&av=0.0.1&ul=en-us&v=1&tid=%3CTRACKING-ID&cid=$clientId&t=event''');
-    });
-
     test(
         'with default batch-delay hits from the same sync span are batched together',
         () async {