【问题标题】:Navigation not working when the app is already running and Firebase Dynamic Links are used当应用程序已在运行且使用 Firebase 动态链接时导航不起作用
【发布时间】: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 的新手,因此不胜感激。谢谢。

【问题讨论】:

    标签: firebase flutter dart firebase-dynamic-links


    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      相关资源
      最近更新 更多