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

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

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

  1. Future<void> _initApp() async {
  2. await _initUriHandler();
  3. await _incomingLinkHandler();
  4. }
  5. Future<void> _initUriHandler() async {
  6. if (_initialUriLinkHandled) {
  7. return;
  8. }
  9. _initialUriLinkHandled = true;
  10. var navigator = Navigator.of(context);
  11. try {
  12. final initialUrl = await getInitialLink();
  13. if (initialUrl != null) {
  14. Uri uri = Uri.parse(initialUrl);
  15. var goToScreen = getScreen(uri);
  16. if (goToScreen == null) {
  17. return;
  18. }
  19. navigator.pushReplacement(
  20. MaterialPageRoute(builder: (context) => goToScreen));
  21. }
  22. } catch (e) {
  23. navigator.pushReplacementNamed(AppRoutes.main);
  24. }
  25. }
  26. _incomingLinkHandler() {
  27. if (kIsWeb) {
  28. return;
  29. }
  30. var navigator = Navigator.of(context);
  31. _streamSubscription = uriLinkStream.listen((Uri? uri) {
  32. var goToScreen = getScreen(uri);
  33. if (goToScreen == null) {
  34. return;
  35. }
  36. navigator
  37. .pushReplacement(MaterialPageRoute(builder: (context) => goToScreen));
  38. }, onError: (err) => navigator.pushReplacementNamed(AppRoutes.main));
  39. }
ymdaylpp

ymdaylpp1#

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

  1. Widget build(BuildContext context) {
  2. return WillPopScope(
  3. onWillPop: (){
  4. if (Navigator.of(context).canPop()) {
  5. Navigator.of(context).pop(); // Has some routes below this route. We can safely pop this route.
  6. } else {
  7. Navigator.of(context).pushReplacement("/"); //Pushing the home route if no routes are available before this route.
  8. }
  9. return true;
  10. },
  11. child: YourRootWidgetPreviously(),
  12. );
  13. }

相关问题