Archive of

Handling Back Navigation with PopScope in Flutter

Building Flutter apps? You'll likely face situations where you need to control the back button. Imagine a user editing a note, and you want a confirmation dialog before they accidentally ditch their work!

The old WillPopScope widget used to handle this, but it's deprecated as of Flutter 3.12 (thanks, Android 14's new back gesture!). The new sheriff in town is PopScope, but it doesn't quite let you block the back action directly.

After a couple hours of researching and investigating, Here's the solution to get PopScope to mimic WillPopScope:

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (bool didPop, object? result) async {
        if (!didPop) {
          final navigator = Navigator.of(context);
          if (_noteController.text.isEmpty || (_noteController.text.isNotEmpty && (await _showUnsavedChangesDialog(context) ?? false))) {
            navigator.pop();
          }
        }
      },
      child: Scaffold(
      ...

and the following shows the difference:

   @override
   Widget build(BuildContext context) {
-    return WillPopScope(
-      onWillPop: () async {
-        if (_noteController.text.isNotEmpty) {
+    return PopScope(
+      canPop: false,
+      onPopInvokedWithResult: (bool didPop, object? result) async {
+        if (!didPop) {
+          final navigator = Navigator.of(context);
+          if (_noteController.text.isEmpty || (_noteController.text.isNotEmpty && (await _showUnsavedChangesDialog(context) ?? false))) {
+            navigator.pop();
+          }
-           final shouldPop = await _showUnsavedChangesDialog(context);
-          return shouldPop ?? false;
         }
-        return true;
       },
       child: Scaffold(

Here's how this solution works:

  1. canPop is set to false, disabling the system back gesture.
  2. In the onPopInvokedWithResult callback, it checks if didPop is false (indicating that the pop operation hasn't occurred yet)
  3. Then, it checks if there aren't any unsaved changes _noteController.text.isEmpty, or, although there are unsaved changes (_noteController.text.isNotEmpty), the user answers Yes when asking confirmation.
  4. If any of the conditions are true, it manually triggers the pop operation by calling navigator.pop(). Otherwise, do nothing.

By disabling the system back gesture (canPop: false) and manually triggering the pop operation (navigator.pop()), this solution allows you to perform necessary actions (e.g., showing a confirmation dialog) before the pop operation occurs, effectively replicating the behavior of WillPopScope.

I hope it helps!

How to: move the cursor to the first non-whitespace (non-blank) character on the current line in Vim

  1. use:^ (shift + 6) This moves the cursor to the first non-blank character of the current line.
  2. _ (underscore) This also moves the cursor to the first non-blank character on the same line the cursor is on.

By the way, the 0 command moves to the absolute start of the line, including any leading whitespace.

Change Github TABSIZE to 4 and make code review easier

Have you ever seen weird indentations when doing code review? Mostly, the cause is that GitHub's default TABSIZE setting is 8 instead of 4 while some old code uses TAB for indentation. Fortunately, we can easily fix it by change this setting. 8 is not an ideal default TABSIZE nowadays, right? so it is all GitHub's fault!

Reference

Ubuntu on Macbook Pro: set the function keys to act like F1-F12 by default (disable Fn default behavior)

put the following line in your ~/.bashrc or ~/.zshrc if you are using zsh

echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode

What? your sudo command asks your password? then

sudo visudo
#add this line
your-user-name  ALL=(ALL:ALL) NOPASSWD:ALL

Don't you want to set this NOPASSWD option for security reasons? then put the following line into /etc/rc.local instead. It should work.

echo 2 > /sys/module/hid_apple/parameters/fnmode

Reference

How to do a case insensitive search in vim

/\cYourSearchKeywords -- case insensitive /\CYourSearchKeywords -- case sensitive, which is the default behaviour

A few other ideas:

  • \c can appear anywhere in the pattern, so if you type a pattern and then decide you wanted a case-insensitive search, just add a \c at the end.
  • add set ignorecase for case-insensitive searching in my vimrc, and I can use \C to do a case-sensitive search
  • There's also set smartcase which will automatically switch to a case-sensitive search if you use any capital letters
    • Remember! set smartcase applies only when set ignorecase is already active

Reference