Reputation: 461
This works perfectly when the user clicks on the back button in the app bar. In Android devices, when the user performs a swipe-to-go-back gesture from the right edge of the screen, not able to return data in this case.
I tried using PopScope but not able to navigate to previous screen with data to be returned.
I'm looking for a way to handle the swipe-to-go-back gesture in Android so that I can still return data when the user swipes to navigate back.
PopScope(
canPop: true,
onPopInvoked: (didPop) {}, // deprecated
onPopInvokedWithResult: (didPop, result) {
Navigator.of(context).pop(true);
},
Upvotes: 0
Views: 68
Reputation: 371
Based on the Android-specific swipe behavior, here's the solution for handling both swipe gestures and back button with data. I've faced similar issues.
Here...
PopScope(
canPop: false, // It prevents automatic pop behavior
onPopInvoked: (didPop) async {
if (didPop) return;
final data = {
'key': 'value',
'status': 'success'
};
Navigator.of(context).pop(data);
},
)
That's all you need to handle swipe-back with data return!
Hope it helps you 👍🏻
Upvotes: 0
Reputation: 11
The swipe-to-go-back gesture on Android behaves differently from the back button, and onPopInvokedWithResult does not trigger when using gestures. To properly return data when swiping back, you can use ModalRoute.of(context)?.settings to detect the back navigation and pass data.
Use WillPopScope Instead WillPopScope to handle both back button and swipe gestures:
WillPopScope(
onWillPop: () async {
Navigator.pop(context, true); // Pass data when swiping back
return true;
},
child: YourScreenWidget(),
);
Upvotes: 0
Reputation: 81
Set canPop to false, if it is set to true, the screen pops before calling onpopinvokedWithResulth
Upvotes: 0