当应用程序已在运行且使用 Firebase 动态链接时导航不起作用

Posted

技术标签:

【中文标题】当应用程序已在运行且使用 Firebase 动态链接时导航不起作用【英文标题】:Navigation not working when the app is already running and Firebase Dynamic Links are used 【发布时间】:2020-07-19 12:44:22 【问题描述】:

如果应用程序是使用动态链接打开的,我有这个加载器小部件,它检查动态链接并导航到/game 路由(gamePage() 小部件)。如果应用是手动打开的,它将导航到/home 路由。

当应用程序关闭然后通过动态链接打开时,我的代码可以正常工作。 但是当应用程序已经打开并且在主页上时,代码就不起作用了,因为上下文是空的。

Loader.dart

class Loader extends StatefulWidget 
  @override
  _LoaderState createState() => _LoaderState();


class _LoaderState extends State<Loader> 


    Future<void> initDynamicLinks() async 
        final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
        final Uri deepLink = data?.link;
        print(deepLink);
        if (deepLink != null) 
          Navigator.pushReplacementNamed(context, '/game');  //this works because app has just started
        
        else
          FirebaseDynamicLinks.instance.onLink(
              onSuccess: (PendingDynamicLinkData dynamicLink) async 
                final Uri deepLink = dynamicLink?.link;

                if (deepLink != null) 
                  print(context);     // prints null
                  Navigator.pushReplacementNamed(context, '/game'); //this does not work because the app is already running and its on /home and context is null
                
              ,
              onError: (OnLinkErrorException e) async 
                print('error Opening the link');
                print(e.message);
              
          );
          Navigator.pushReplacementNamed(context, '/home');  // load home widget if there are no deep links
        
      

    @override
    void initState()
      super.initState();
      initDynamicLinks();
    


    @override
    Widget build(BuildContext context) 
       //Loading animation widget code
    

main.dart

void main() 
  runApp(MaterialApp(
    initialRoute: "/load",
    routes:<String, WidgetBuilder> 
      '/load': (context) => Loader(),
      '/home': (context) => Home(),
      '/game': (context) => gamePage(),
    ,
  ),
  );

我是 Flutter 的新手,因此不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

是的,你是对的。没有上下文是行不通的。因此,每次深层链接调用时,您都需要提供上下文。

要实现这一点,请为管理深层链接创建一个自定义类。然后,您可以通过提供上下文来启动该深层链接。

请看下面的例子。

自定义类

class DynamicLinkService 

  Future handleDynamicLinks(BuildContext context) async 
    final PendingDynamicLinkData data =
    await FirebaseDynamicLinks.instance.getInitialLink();

    _handleDeepLink(data, context);

    FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLink) async 
          // handle link that has been retrieved
          _handleDeepLink(dynamicLink, context);
        , onError: (OnLinkErrorException e) async 
      print('Link Failed: $e.message');
    );
  

  void _handleDeepLink(PendingDynamicLinkData data, BuildContext context) 
    final Uri deepLink = data?.link;
    if (deepLink != null) 
      print('_handleDeepLink | deeplink: $deepLink');

      var isPost = deepLink.pathSegments.contains('post');
      var isInvite = deepLink.pathSegments.contains('invite');
      if(isInvite)
        Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
            NavigationHomeScreen()), (Route<dynamic> route) => false);
      
    
  

从您的加载器小部件启动深层链接

class Loader extends StatefulWidget 
  @override
  _LoaderState createState() => _LoaderState();


class _LoaderState extends State<Loader> 

  final DynamicLinkService _dynamicLinkService = DynamicLinkService();

    @override
    void initState()
      super.initState();
      _dynamicLinkService.handleDynamicLinks(context);
    


    @override
    Widget build(BuildContext context) 
       //Loading animation widget code
    

【讨论】:

以上是关于当应用程序已在运行且使用 Firebase 动态链接时导航不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何检查电子邮件地址是不是已在 iOS 上的 Firebase 中使用?

动态链接 Firebase

Firebase 扩展:使用 Stripe 运行订阅付款不会返回 sessionId

无法从 Firebase 缩短的动态链接网址检索动态链接

当动态链接具有自定义子域时,Firebase 动态链接在 iOS 上不起作用

如何检查电子邮件地址是不是已在使用 Firebase