Виджет PopScope
Виджет PopScope оборачивает child
и задаёт canPop:
можно ли снять текущий Route.
Колбэк onPopInvokedWithResult
вызывают, когда пользователь нажал назад или жест.
Работает вместе с
Navigator.
Синтаксис
PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {},
child: child,
)
Параметры
| Параметр | Описание |
|---|---|
canPop |
Разрешить Navigator.pop и системный назад.
|
onPopInvokedWithResult |
Вызывается после попытки pop; didPop показывает успех. |
child |
Дочерний виджет экрана. |
Пример
Давайте запретим закрытие экрана:
import 'package:flutter/material.dart';
class BlockPopPage extends StatefulWidget
{
const BlockPopPage({super.key});
@override
State<BlockPopPage> createState() => _BlockPopPageState();
}
class _BlockPopPageState extends State<BlockPopPage>
{
var message = 'abcde';
@override
Widget build(BuildContext context)
{
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {
if (!didPop) {
setState(() {
message = '12345';
});
}
},
child: Scaffold(
body: Center(
child: Text(message),
),
),
);
}
}
void main()
{
runApp(
MaterialApp(
home: BlockPopPage(),
),
);
}
На экране текст 'abcde'; системный назад не закроет экран, а сменит текст на '12345'.
Пример
Давайте разрешим pop после подтверждения:
import 'package:flutter/material.dart';
class AllowPopPage extends StatelessWidget
{
const AllowPopPage({super.key});
@override
Widget build(BuildContext context)
{
return PopScope(
canPop: true,
child: Scaffold(
appBar: AppBar(
title: const Text('abcde'),
),
body: const Center(
child: Text('12345'),
),
),
);
}
}
void main()
{
runApp(
MaterialApp(
home: AllowPopPage(),
),
);
}
На экране AppBar и текст; кнопка назад и жест pop закроют маршрут, если под ним есть стопка.