当应用程序处于后台时,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);
  }
  1. 应用已启动并在后台。
  2. 用户点击 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),最新发出的值就会保留在内存中。