当应用程序处于后台时,Flutter `FirebaseDynamicLinks.onLink` 调用 `onSuccess` 两次
Flutter `FirebaseDynamicLinks.onLink` calls `onSuccess` twice when the app is in background
在pubspec.yaml中:
firebase_dynamic_links: ^0.5.0+11
代码:
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
onLinkReceived(deepLink);
}
},
onError: onError);
}
- 应用已启动并在后台。
- 用户点击 link。
实际结果:onSuccess
被调用两次 link。
预期结果:onSuccess
被调用并且每个 link 被调用一次。
有什么问题吗?
所以,这似乎是一个已知问题。
当我们等待稳定通道的修复时,我正在使用某种双重调用过滤器作为解决方法,它看起来有点像这样:
class DoubleCallFilter<T> {
T _lastValue;
int _lastValueTime = 0;
final int timeoutMs;
final Future Function(T) action;
DoubleCallFilter({@required this.action, this.timeoutMs = 500});
Future<dynamic> call(T value) async {
final currentTime = DateTime.now().millisecondsSinceEpoch;
if (_lastValue == value) {
if (currentTime - _lastValueTime <= timeoutMs) {
return;
}
}
_lastValue = value;
_lastValueTime = currentTime;
if (action != null) await action(_lastValue);
}
}
以及用法:
FirebaseDynamicLinks.instance.onLink(
onSuccess: DoubleCallFilter<PendingDynamicLinkData>(
action: (dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
await onLinkReceived(deepLink);
}
},
),
onError: onError,
);
此解决方案的缺点之一是,只要整个 DoubleCallFilter 未被销毁(gc'ed),最新发出的值就会保留在内存中。
在pubspec.yaml中:
firebase_dynamic_links: ^0.5.0+11
代码:
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
onLinkReceived(deepLink);
}
},
onError: onError);
}
- 应用已启动并在后台。
- 用户点击 link。
实际结果:onSuccess
被调用两次 link。
预期结果:onSuccess
被调用并且每个 link 被调用一次。
有什么问题吗?
所以,这似乎是一个已知问题。
当我们等待稳定通道的修复时,我正在使用某种双重调用过滤器作为解决方法,它看起来有点像这样:
class DoubleCallFilter<T> {
T _lastValue;
int _lastValueTime = 0;
final int timeoutMs;
final Future Function(T) action;
DoubleCallFilter({@required this.action, this.timeoutMs = 500});
Future<dynamic> call(T value) async {
final currentTime = DateTime.now().millisecondsSinceEpoch;
if (_lastValue == value) {
if (currentTime - _lastValueTime <= timeoutMs) {
return;
}
}
_lastValue = value;
_lastValueTime = currentTime;
if (action != null) await action(_lastValue);
}
}
以及用法:
FirebaseDynamicLinks.instance.onLink(
onSuccess: DoubleCallFilter<PendingDynamicLinkData>(
action: (dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
await onLinkReceived(deepLink);
}
},
),
onError: onError,
);
此解决方案的缺点之一是,只要整个 DoubleCallFilter 未被销毁(gc'ed),最新发出的值就会保留在内存中。