pushReplacementNamed 不会替换它,如果来自 AlertDialog ,则只会推到顶部



代码:

3 FILES home, main, and 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'),
),
),
);
}
}

screen1:

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(...))本身将作为新路由推送。因此,当在警报中执行Navigator.pushReplacementNamed时,它将替换警报本身,而不是前一个屏幕。这就是为什么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)),
),
);
}
}

最新更新