【问题标题】:Flutter `FirebaseDynamicLinks.onLink` calls `onSuccess` twice when the app is in background当应用程序处于后台时,Flutter `FirebaseDynamicLinks.onLink` 会调用 `onSuccess` 两次
【发布时间】:2020-03-06 16:16:00
【问题描述】:

在 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. 用户点击链接。

实际结果:onSuccess 为链接被调用了两次。

预期结果:onSuccess 正在被调用,并且每个链接都被调用一次。

可能出了什么问题?

【问题讨论】:

标签: flutter firebase-dynamic-links


【解决方案1】:

所以,这似乎是一个已知问题。

在我们等待稳定频道的修复时,我正在使用某种双重呼叫过滤器作为解决方法,看起来有点像这样:

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),最新发出的值就会保存在内存中。

【讨论】:

  • 应用程序在后台时我没有问题我在应用程序关闭时仍然有同样的问题。
  • 你知道问题是否已经在当前版本的 firebase 中修复了吗?
  • 我真的不知道一年多前我必须切换回原生 Android。尝试新版本的 Firebase,看看会发生什么。
猜你喜欢
  • 2020-01-25
  • 2017-11-06
  • 2018-02-14
  • 2020-07-29
  • 2019-01-30
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多