Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序已运行且使用Firebase动态链接时导航不起作用_Firebase_Flutter_Dart_Firebase Dynamic Links - Fatal编程技术网

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

应用程序已运行且使用Firebase动态链接时导航不起作用,firebase,flutter,dart,firebase-dynamic-links,Firebase,Flutter,Dart,Firebase Dynamic Links,我有一个加载程序小部件,它可以检查动态链接,并在应用程序使用动态链接打开时导航到/game路径(gamePage()小部件)。如果应用程序是手动打开的,它将导航到/home路线 我的代码可以在应用程序关闭后通过动态链接打开时正常工作。 但是当应用程序已经打开并且在主页上时,代码就不能工作了,因为上下文是空的 装载机省道 class Loader extends StatefulWidget { @override _LoaderState createState() => _Loa

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

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

装载机省道

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
    }
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
Future initdynamiclings()异步{
final PendingDynamicLinkData=等待FirebaseDynamicLinks.instance.getInitialLink();
最终Uri deepLink=数据?.link;
印刷(深度链接);
if(deepLink!=null){
Navigator.pushReplacementNamed(context,“/game”);//由于应用程序刚刚启动,所以此操作有效
}
否则{
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
最终Uri deepLink=dynamicLink?.link;
if(deepLink!=null){
打印(上下文);//打印空
Navigator.pushReplacementNamed(context,/game');//这不起作用,因为应用程序已在运行,并且其on/home和context为null
}
},
onError:(OnLinkErrorException e)异步{
打印(“打开链接时出错”);
打印(电子信息);
}
);
Navigator.pushreplacementname(上下文,“/home”);//如果没有深层链接,则加载home小部件
}
}
@凌驾
void initState(){
super.initState();
initdynamiclings();
}
@凌驾
小部件构建(构建上下文){
//加载动画小部件代码
}
}
主飞镖

void main() {
  runApp(MaterialApp(
    initialRoute: "/load",
    routes:<String, WidgetBuilder> {
      '/load': (context) => Loader(),
      '/home': (context) => Home(),
      '/game': (context) => gamePage(),
    },
  ),
  );
}
void main(){
runApp(材料应用程序)(
initialRoute:“/load”,
路线:{
“/load”:(上下文)=>Loader(),
“/home”:(上下文)=>home(),
“/game”:(上下文)=>gamePage(),
},
),
);
}

我是个新手,非常感谢你的帮助。谢谢。

是的,你说得对。没有上下文,它就不起作用。所以每次深层链接调用时,您都需要提供一个上下文

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

请参见下面的示例

定制类

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);
      }
    }
  }
}
类动态链接服务{
未来HandleDynamicLink(BuildContext上下文)异步{
最终PendingDynamicLink数据=
等待FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(数据、上下文);
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
//已检索的句柄链接
_handleDeepLink(动态链接,上下文);
},onError:(OnLinkErrorException e)异步{
打印('链接失败:${e.message}');
});
}
void _handleDeepLink(PendingDynamicLinkData数据,BuildContext上下文){
最终Uri deepLink=数据?.link;
if(deepLink!=null){
打印(“U handleDeepLink | deeplink:$deeplink”);
var isPost=deepLink.pathSegments.contains('post');
var isInvite=deepLink.pathSegments.contains('invite');
如果(isInvite){
Navigator.of(context).pushandremoveintil(materialpage路线)(生成器:(context)=>
NavigationHomeScreen(),(路由)=>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
    }
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
最终DynamicClinkService _dynamicClinkService=dynamicClinkService();
@凌驾
void initState(){
super.initState();
_DynamicClinkService.handleDynamicLinks(上下文);
}
@凌驾
小部件构建(构建上下文){
//加载动画小部件代码
}
}

是的,你说得对。没有上下文,它就不起作用。所以每次深层链接调用时,您都需要提供一个上下文

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

请参见下面的示例

定制类

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);
      }
    }
  }
}
类动态链接服务{
未来HandleDynamicLink(BuildContext上下文)异步{
最终PendingDynamicLink数据=
等待FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(数据、上下文);
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
//已检索的句柄链接
_handleDeepLink(动态链接,上下文);
},onError:(OnLinkErrorException e)异步{
打印('链接失败:${e.message}');
});
}
void _handleDeepLink(PendingDynamicLinkData数据,BuildContext上下文){
最终Uri deepLink=数据?.link;
if(deepLink!=null){
打印(“U handleDeepLink | deeplink:$deeplink”);
var isPost=deepLink.pathSegments.contains('post');
var isInvite=deepLink.pathSegments.contains('invite');
如果(isInvite){
Navigator.of(context).pushandremoveintil(materialpage路线)(生成器:(context)=>
NavigationHomeScreen(),(路由)=>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
    }
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
最终DynamicClinkService _dynamicClinkService=dynamicClinkService();
@凌驾
void initState(){
super.initState();
_动力