Flutter Firebase Dynamic Link Navigator.push not navigating

1,076

As mentioned in my comment, the issue here is that the expected BuildContext isn't used in Navigator.push().

Without a minimal repro, it's difficult to provide a concrete solution. Since you've mentioned that you're using an Authenticator class that pushes a new page/screen, it might be safer to manage the screen of the app in a single class. With this, it's easier to manage the BuildContext being used in Navigator.push(). You may check this sample in this blog post and see if it fits your use case.

Share:
1,076
Abhishek Kumar
Author by

Abhishek Kumar

I am Software Engineer with experience in delivering appropriate technology solutions. Comprehensive knowledge of platform development, enterprise architecture, agile methodologies, cloud services, mobile applications, and web-based applications. Innovative change agent with a unique mix of high-level technology direction and deep technical expertise in Front-end, Back-end, Machine Learning, & graphic designing

Updated on December 25, 2022

Comments

  • Abhishek Kumar
    Abhishek Kumar over 1 year

    I am trying to implement Firebase Dynamic links in a flutter. But when I click on the link it calls the functions but does not take me to the specified page.

    Code Implementation

    main.dart

    Main Entry Final for Application

    void main() {
    
      Crashlytics.instance.enableInDevMode = true;
      FlutterError.onError = Crashlytics.instance.recordFlutterError;
    
      runZoned(() {
    
        runApp(MyApp());
      }, onError: Crashlytics.instance.recordError);
    
    
    
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
    
        DynamicLinks dynamicLinks = new DynamicLinks();
        dynamicLinks.initDynamicLinks(context);
    
    
        SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
        return LayoutBuilder(builder: (context, constraints) {
          return OrientationBuilder(builder: (context, orientation) {
            SizeConfig().init(constraints, orientation);
    
            return MaterialApp(
              title: 'APP NAME',
              theme: ThemeData(
                  primarySwatch: Colors.orange,
                  brightness: Brightness.light,
              ),
              debugShowCheckedModeBanner: false,
                home:SplashScreenMain(),
            );
          });
        });
      }
    }
    
    

    dynamicLinkManager.dart

    Another class to handle Dynamic Links.

    class DynamicLinks {
      void initDynamicLinks(BuildContext context) async{
    
    
        var data = await FirebaseDynamicLinks.instance.getInitialLink();
    
        FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink)  async {
          print("Main = ${dynamicLink}");
          var deepLink = dynamicLink?.link;
    
          final queryParams = deepLink.queryParameters;
    
          debugPrint('DynamicLinks onLink $deepLink');
          print("queryParams $queryParams");
    
          if(DynamicLinksConst.inviteUser == deepLink.path){
            print("Step 1.......Code Works");
            
            /* THIS PART CODE IS NOT WORKING  */
            Login.setActiveContext(context);
            Navigator.push(context,
              EaseInOutSinePageRoute(
                  widget: SignupPage()), //MaterialPageRoute
            );
          }else{
            Navigator.push(context,
              EaseInOutSinePageRoute(
                  widget: LoginPage()), //MaterialPageRoute
            );
          }
        }, onError: (e) async {
          debugPrint('DynamicLinks onError $e');
        });
    
      }
    
     
    
    
    
    }
    
    

    Console Output Here is the output you can see that its returning data captured by dynamic link. I Don't Think it a problem with firebase dynamic link it feels like more of a Navigator problem but I am unable to identify the problem here as this Navigator is working properly throughout the project expect here.

    EaseInOutSinePageRoute just adds animation to navigations.

    I/flutter (  395): Main = Instance of 'PendingDynamicLinkData'
    I/flutter (  395): DynamicLinks onLink https://example.com/abc?para1=dataOne
    I/flutter (  395): queryParams {para1: dataOne}
    I/flutter (  395): Step 1.......Code Works
    
    • Omatt
      Omatt over 3 years
      It looks like the issue here is with Navigator.push() and Dynamic Links works properly. Could you check if it's getting the expected BuildContext to push the target screen?
    • Abhishek Kumar
      Abhishek Kumar over 3 years
      @Omatt I think you're right. When I remove my Authenticator Class it works fine. The Authenticator is checking for user data in shared preference and pushing the new page on the base of it. After 3 seconds of wait on the splash screen Authenticator is called? so maybe it's overwriting the main context. How can I manage the context of main even if its overwritten by another page call?
  • Abhishek Kumar
    Abhishek Kumar over 3 years
    Thank you for sharing this looks promising ( the blog post it makes code much more manageable ), But I resolved it by adding navigatorKey in my material app and using it to navigate. But in long run, I will be changing it to onGeneratedRoute.