8

When integrating Flutter to a host app (docs) there is a few ways to do it, one of them (simplest) is open Flutter in a new Activity via FlutterActivity class. Like this:

// Java
hostActivity.startActivity(                
  FlutterActivity.withCachedEngine("my_engine_id").build(context)
);

Traditionally for Android style windows on Flutter side we create AppBar with Back button.

This AppBar back button and Android system back button must behave the same: foreground activity must been closed (finish) when pressing to back button.

Currently system back button really closes the FlutterActivity, but how to emulate this behaviour from flutters AppBar back button?

// Dart - Flutter side
...
child: AppBar(
  leading: IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: () {
          // WHAT MUST BE HERE?
      }),
...

PS Platform channel between Flutter side and host established - I can call any code from any side

nail
  • 715
  • 7
  • 20

2 Answers2

5

Solution found:

SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop');

Removes the topmost Flutter instance, presenting what was before it.

On Android, removes this activity from the stack and returns to the previous activity.

Documentation here: api reference

nail
  • 715
  • 7
  • 20
  • Another option that came to mind, but I have not tried to implement it: Extend your _activity_ from `FlutterActivity` and implement some kind of receiving signal to finish yourself. Via platform channels call method to send signal to finish, and your runned activity will finish yourself. – nail Jan 29 '20 at 09:22
1
...
leading: BackButton(
          onPressed: () => {
            if (Navigator.canPop(context))
              {Navigator.pop(context)}
            else
              {SystemNavigator.pop()}
          },
        )
...
NickUnuchek
  • 11,794
  • 12
  • 98
  • 138