read static method
Reads the referrer. query and isAndroid are for tests.
Implementation
static Future<String?> read({
Future<String?> Function()? query,
bool? isAndroid,
Duration timeout = defaultTimeout,
}) async {
final android =
isAndroid ??
(!kIsWeb && defaultTargetPlatform == TargetPlatform.android);
if (!android) return null;
final ask =
query ??
() async =>
(await AndroidPlayInstallReferrer.installReferrer).installReferrer;
final deadline = DateTime.now().add(timeout);
for (var attempt = 0; attempt < 2; attempt++) {
final remaining = deadline.difference(DateTime.now());
if (remaining <= Duration.zero) break;
try {
final value = await ask().timeout(remaining);
return value != null && value.trim().isNotEmpty ? value : null;
} on TimeoutException {
LinkFortyLogger.log('Play install referrer: no answer in time');
return null;
} on MissingPluginException {
LinkFortyLogger.log('Play install referrer: plugin not available');
return null;
} catch (e) {
LinkFortyLogger.log('Play install referrer unavailable: $e');
if (attempt == 0) {
final left = deadline.difference(DateTime.now());
await Future<void>.delayed(left < _retryDelay ? left : _retryDelay);
}
}
}
return null;
}