PopScopeとは?
What PopScope<T> class
Manages back navigation gestures.
The generic type should match or be a supertype of the generic type of the enclosing Route. For example, if the enclosing Route is a MaterialPageRoute<int>, you can define PopScope with int or any supertype of int.
The canPop parameter disables back gestures when set to false.
The onPopInvokedWithResult parameter reports when pop navigation was attempted, and didPop indicates whether or not the navigation was successful. The result contains the pop result.
Android has a system back gesture that is a swipe inward from near the edge of the screen. It is recognized by Android before being passed to Flutter. iOS has a similar gesture that is recognized in Flutter by CupertinoRouteTransitionMixin, not by iOS, and is therefore not a system back gesture.
If canPop is false, then a system back gesture will not pop the route off of the enclosing Navigator. onPopInvokedWithResult will still be called, and didPop will be false. On iOS when using CupertinoRouteTransitionMixin with canPop set to false, no gesture will be detected at all, so onPopInvokedWithResult will not be called. Programmatically attempting pop navigation will also result in a call to onPopInvokedWithResult, with didPop indicating success or failure.
If canPop is true, then a system back gesture will cause the enclosing Navigator to receive a pop as usual. onPopInvokedWithResult will be called with didPop as true, unless the pop failed for reasons unrelated to PopScope, in which case it will be false.
翻訳すると
バックナビゲーションジェスチャーを管理します。
ジェネリックタイプは、囲んでいる Route のジェネリックタイプと一致するか、そのスーパータイプである必要があります。例えば、囲んでいる Route が MaterialPageRoute<int> の場合、int または int のスーパータイプで PopScope を定義できます。
canPop パラメータは、false に設定するとバックジェスチャーを無効にします。
onPopInvokedWithResult パラメータは、ポップ ナビゲーションが試行されたことを報告し、didPop は、ナビゲーションが成功したかどうかを示します。resultにはポップ結果が含まれます。
Androidには、画面の端近くから内側にスワイプするシステムバックジェスチャがあります。iOSにも同様のジェスチャーがあるが、FlutterではiOSではなくCupertinoRouteTransitionMixinによって認識されるため、システムバックジェスチャーではない。
canPopがfalseの場合、システムバックジェスチャは囲んでいるナビゲータからルートをポップしません。iOSで、canPopがfalseに設定されたCupertinoRouteTransitionMixinを使用している場合、ジェスチャはまったく検出されないため、onPopInvokedWithResultは呼び出されません。プログラムでポップ ナビゲーションを試みても、onPopInvokedWithResult が呼び出され、didPop が成功または失敗を示します。
onPopInvokedWithResultはdidPopをtrueとして呼び出されますが、PopScopeとは無関係な理由でポップが失敗した場合はfalseになります。
使い方
画面遷移する次のページのクラスのScaffold
をPopScope
でラップして使う。
こちらの動画参考になります。ぜひ見てみてください。
- 使い方
- canPopがtrueだと元の画面に戻れる。
- canPopがfalseだと元の画面に戻れない。
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
Widget build(BuildContext context) {
return PopScope(
canPop: false,
onPopInvoked: (value) {
debugPrint(value.toString());
},
child: Scaffold(
appBar: AppBar(),
body: const Center(child: Text('HomeScreen'),),
),
);
}
}
全体のコード
import 'package:flutter/material.dart';
void main() {
runApp(const MainApp());
}
class MainApp extends StatelessWidget {
const MainApp({super.key});
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage());
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('YouTube'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(onPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => const HomeScreen()));
}, child: const Text('HomeScreen'))
],
),
),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
Widget build(BuildContext context) {
return PopScope(
canPop: false,
onPopInvoked: (value) {
debugPrint(value.toString());
},
child: Scaffold(
appBar: AppBar(),
body: const Center(child: Text('HomeScreen'),),
),
);
}
}
最後に
公式に書いてあるように、canPop パラメータは、false に設定するとバックジェスチャーを無効にします。となっているのでバックボタンを押しても画面遷移をすることができなくなります。
Discussion