flutter 返回到应用程序的主屏幕,如果单击后退按钮将关闭整个应用程序

rm5edbpk  于 2023-04-13  发布在  Flutter
关注(0)|答案(1)|浏览(298)

我在我的应用程序中设置了深度链接。当应用程序没有打开时(甚至在后台也没有),我打开应用程序的URL,它会把我带到正确的页面。但是点击后退按钮会关闭整个应用程序,因为它没有可以弹出的前一个屏幕。
我想让它转到当前屏幕之前的任何屏幕,或者如果没有前一个屏幕,则转到主屏幕。
这就是我如何设置深度链接:

Future<void> _initApp() async {

    await _initUriHandler();
    await _incomingLinkHandler();
}

  Future<void> _initUriHandler() async {
    if (_initialUriLinkHandled) {
      return;
    }
    _initialUriLinkHandled = true;
    var navigator = Navigator.of(context);
    try {
      final initialUrl = await getInitialLink();
      if (initialUrl != null) {
        Uri uri = Uri.parse(initialUrl);
        var goToScreen = getScreen(uri);
        if (goToScreen == null) {
          return;
        }
        navigator.pushReplacement(
            MaterialPageRoute(builder: (context) => goToScreen));
      }
    } catch (e) {
      navigator.pushReplacementNamed(AppRoutes.main);
    }
  }

  _incomingLinkHandler() {
    if (kIsWeb) {
      return;
    }

    var navigator = Navigator.of(context);
    _streamSubscription = uriLinkStream.listen((Uri? uri) {
      var goToScreen = getScreen(uri);
      if (goToScreen == null) {
        return;
      }
      navigator
          .pushReplacement(MaterialPageRoute(builder: (context) => goToScreen));
    }, onError: (err) => navigator.pushReplacementNamed(AppRoutes.main));
  }
ymdaylpp

ymdaylpp1#

您可以使用WillPopScope小部件来处理后退按钮的按下。
您导航到的屏幕,例如:GoToScreen可以写成这样:
在GoToScreen构建方法中:

Widget build(BuildContext context) {
   return WillPopScope(
       onWillPop: (){
           if (Navigator.of(context).canPop()) {
               Navigator.of(context).pop(); // Has some routes below this route. We can safely pop this route.
           } else {
               Navigator.of(context).pushReplacement("/"); //Pushing the home route if no routes are available before this route.
           }
           return true;
       },
       child: YourRootWidgetPreviously(),
   );
}

相关问题