繁体   English   中英

在哪里处理 Flutter 中的 Firebase 动态链接?

[英]Where to handle Firebase Dynamic Links in Flutter?

我使用 Firebase 动态链接和命名路由。 我想要的是为动态链接事件安装一个全局侦听器,并在提供令牌时转发到注册页面。 在下面的代码中,我得到了异常The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget. 这意味着我必须将导航代码放在 MaterialApp 的home:属性下方。 但是在执行此操作时,我必须为每个路由实现动态链接事件处理程序。

class MyApp extends StatelessWidget {
  String title = "Framr";

  @override
  Widget build(BuildContext context) {

    FirebaseDynamicLinks.instance.onLink(
      onSuccess: (linkData) {
        if (linkData != null) {
          try {
            Navigator.pushNamed(context, '/register', arguments: linkData);
            // throws: The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
          } catch(e) {
            print(e);
          }
        }
        return null;
      }
    );

    return MaterialApp(
      title: "...",
      home: LoginPage(),
      routes: {
        '/createEvent': (context) => CreateEventPage(),
        '/showEvent': (context) => ShowEventPage(),
        '/register': (context) => RegisterPage(),
      },
    );
  }
}

我能够通过使用no_context_navigation包或 GlobalKey 遵循动态链接自述文件中提供的示例来解决缺少上下文来调用 Navigator.pushNamed(...) 的方法来完成这项工作。 注意:您不必使用 no_context_navigation。 您可以自己实现无上下文路由。 这是一个例子

// Add this
import 'package:no_context_navigation/no_context_navigation.dart';

void main() {
  runApp(MaterialApp(
    title: 'Dynamic Links Example',
    // Add this
    navigatorKey: NavigationService.navigationKey,
    routes: <String, WidgetBuilder>{
      '/': (BuildContext context) => MyHomeWidget(), // Default home route
      '/helloworld': (BuildContext context) => MyHelloWorldWidget(),
    },
  ));
}

class MyHomeWidgetState extends State<MyHomeWidget> {
  .
  .
  .
  @override
  void initState() {
    super.initState();
    this.initDynamicLinks();
  }

  void initDynamicLinks() async {
    FirebaseDynamicLinks.instance.onLink(
      onSuccess: (PendingDynamicLinkData dynamicLink) async {
        // Add this.
        final NavigationService navService = NavigationService();
        final Uri deepLink = dynamicLink?.link;

        if (deepLink != null) {
          // This doesn't work due to lack of context
          // Navigator.pushNamed(context, deepLink.path);
          
          // Use this instead
          navService.pushNamed('/helloworld', args: dynamicLink);
        }
      },
      onError: (OnLinkErrorException e) async {
        print('onLinkError');
        print(e.message);
      }
    );
    
    final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
    final Uri deepLink = data?.link;

    if (deepLink != null) {
      // This doesn't work due to lack of context
      // Navigator.pushNamed(context, deepLink.path);
      
      // Use this instead
      navService.pushNamed('/helloworld', args: dynamicLink);
    }
  }
  .
  .
  .
}

// pubspec.yaml
no_context_navigation: ^1.0.4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM