1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Flutter】PopScopeとonPopInvokedWithResult()の使い方

Posted at

はじめに

FlutterのPopScopeとonPopInvokedWithResult()の使い方を紹介します。

PopScopeの用途

Androidでバックキーや横スワイプで戻る動作が行われたときの挙動を制御したいときに使用します。

PopScopeの使い方

最上位のウィジェットをラップして使用します。

class SampleView extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return PopScope(
      child: Scaffold(
        ...省略...
      )
    )
  }
}

onPopInvokedWithResult()の使い方

PopScope()の引数にcanPop:falseとonPopInvokedWithResult()を追加します。

    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (didPop, __) async {
        if (didPop == true) return;

        if (isEditing) {
            // 画面遷移して良いか確認する
            if (isOk) {
              Navigator.of(context).pop();
            }
        }else {
            Navigator.of(context).pop();
        }
      },
      child: Scaffold(
        ...省略...
      )
    )

onPopInvokedWithResult()は画面をpopする処理が実行されたときと、Androidでバックボタンを押したときに呼ばれます。そのため、Androidでバックボタンを押して、onPopInvokedWithResult()内で画面をpopする処理を実行するとonPopInvokedWithResult()が2回呼ばれてしまいます。

画面をpopする処理が実行されたとき、didPopは常にtrueになります。Androidでバックボタンを押したときのdidPopはPopScopeの引数で設定した値が渡されます。そのため、Androidのバックボタンを動作したときの処理を実行する処理を実装する場合、canPop: falseを設定し、if (didPop == true) return;のように書きます。

まとめ

onPopInvokedWithResult()が登場して当初使い方を間違っていたのですが、デバッグビルドだと検知できずデグレを起こしそうになりました。このあたりもう少し直感的になってくれると嬉しいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?