代码如下:

3个文件home、main和screen1

主要:

import 'package:flutter/material.dart';
import 'home.dart';
import 'screen1.dart';

void main() {
  runApp(MaterialApp(
    home: Home(),
    routes:
    {
      '/home' : (context) => Home(),
      '/screen1': (context) => Screen1()
    },
  ));
}

主页:

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: (){Navigator.pushReplacementNamed(context, '/screen1');},
          child: Text('screen 1'),
        ),
      ),
    );
  }
}

屏幕1:

import 'package:flutter/material.dart';

Widget homeDialog(BuildContext context){
  return AlertDialog(
    title: const Text('Do you want to exit'),
    actions: [
      ElevatedButton(
        child: const Text('No'),
        onPressed: (){
          Navigator.pop(context);
        },
      ),
      ElevatedButton(
        child: const Text('Yes'),
        onPressed: (){
          Navigator.pushReplacementNamed(context, '/home');
        },
      ),
    ],
  );
}

class Screen1 extends StatefulWidget {
const Screen1({Key? key}) : super(key: key);

@override
State<Screen1> createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading:  false,
       title: Text('screen 1'),
      leading: GestureDetector(
      onTap: (){showDialog(context: context, builder: homeDialog);},
      child: Icon(Icons.home)
      ),
    ),
   );
}
}

推荐答案

这是因为showDialog(AlertDialog(...))本身将被推为一条新路由.因此,当在alert 内执行Navigator.pushReplacementNamed时,它将替换alert 本身,而不是上一个屏幕.这就是为什么HomeScreen1被堆叠在一起.

为了解决这个问题,AlertDialog应该只由Navigator.pop(context, result)返回,并将结果作为其参数传递.来源如下:

AlertDialog

Widget homeDialog(BuildContext context) {
  return AlertDialog(
    title: const Text('Do you want to exit'),
    actions: [
      ElevatedButton(
        child: const Text('No'),
        onPressed: () => Navigator.pop(context, false),
      ),
      ElevatedButton(
        child: const Text('Yes'),
        onPressed: () => Navigator.pop(context, true),
      ),
    ],
  );
}

Screen1

class Screen1 extends StatefulWidget {
  const Screen1({Key? key}) : super(key: key);

  @override
  State<Screen1> createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Text('screen 1'),
        leading: GestureDetector(
            onTap: () async {
              bool? yes =
                  await showDialog<bool>(context: context, builder: homeDialog);
              // `mounted` checks if this screen hasn't been disposed already.
              if (mounted) {
                if (yes == true) {
                  Navigator.pushReplacementNamed(context, '/home');
                } else {
                  Navigator.pop(context);
                }
              }
            },
            child: Icon(Icons.home)),
      ),
    );
  }
}

Flutter相关问答推荐

如何在容器中移动图标按钮?

如何等待抖动S定时器.定期取消?

下拉图标未居中

无法将Flutter 连接到Firebase

如何在WidgetRef引用外部的函数中使用Riverpod刷新数据

flutter -当使用SingleChildScrollView包装我的列小部件时,它不会填充整个高度

在Flutter 中更改扩展瓷砖的高度

如何将WebViewWidget和WillPopScope结合起来

StateNotifer正在riverpod中提供初始状态值(bool)

按一下按钮即可更新 fl_chart

Flutter蓝牙 - 如何通过蓝牙从设备中获取文件?

是否可以在 flutter 应用程序中使用 jetpack compose?

在 flutter 中获取最喜欢的文档

我一直在try 创建按钮以导航到第二页,但不知何故 RaisedButton 功能无法正常工作

如何在屏幕按钮中排列 row() (我想在按钮中放置屏幕导航图标)

Firebase Cloud Messaging (Flutter):订阅主题时出现错误消息

Flutter Firestore 数据库排序最近 24 小时内最喜欢的文档

在 Flutter 中,如何使用文本字段和方形图像进行行布局

try 为两个下拉值添加共享首选项,但在 Flutter 上显示错误断言失败:?

Flutter:整个判断整个应用生命周期的通用类