Skip to content

Commit

Permalink
fix: prevent unexpected application exit (widgetbook#1177)
Browse files Browse the repository at this point in the history
  • Loading branch information
mjablecnik committed Aug 2, 2024
1 parent 88f82b6 commit a7fcfaa
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 6 deletions.
64 changes: 58 additions & 6 deletions packages/widgetbook/lib/src/layout/mobile_layout.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import 'package:back_button_interceptor/back_button_interceptor.dart';
import 'package:flutter/material.dart';

import '../settings/settings.dart';
import '../state/state.dart';
import 'base_layout.dart';

class MobileLayout extends StatelessWidget implements BaseLayout {
class MobileLayout extends StatefulWidget implements BaseLayout {
const MobileLayout({
super.key,
required this.navigationBuilder,
Expand All @@ -20,14 +21,65 @@ class MobileLayout extends StatelessWidget implements BaseLayout {
final List<Widget> Function(BuildContext context) argsBuilder;
final Widget workbench;

@override
State<MobileLayout> createState() => _MobileLayoutState();
}

class _MobileLayoutState extends State<MobileLayout> {

@override
void initState() {
super.initState();
BackButtonInterceptor.add(interceptor);
}

@override
void dispose() {
BackButtonInterceptor.remove(interceptor);
super.dispose();
}

Future<bool> interceptor(bool stopDefaultButtonEvent, RouteInfo info) async {
final navigator = Navigator.of(context);
if (navigator.canPop()) {
navigator.pop();
return true;
} else {
final exitApp = await showDialog<bool>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Exit'),
content: const Text('Do you want to exit app?'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(false);
},
child: const Text('NO'),
),
TextButton(
onPressed: () {
Navigator.of(context).pop(true);
},
child: const Text('YES'),
),
],
);
},
);
return exitApp != true;
}
}

@override
Widget build(BuildContext context) {
final state = WidgetbookState.of(context);

return Scaffold(
key: ValueKey(state.isNext), // Rebuild when switching to next
body: SafeArea(
child: workbench,
child: widget.workbench,
),
bottomNavigationBar: ExcludeSemantics(
child: BottomNavigationBar(
Expand All @@ -52,25 +104,25 @@ class MobileLayout extends StatelessWidget implements BaseLayout {
switch (index) {
case 0:
return ExcludeSemantics(
child: navigationBuilder(context),
child: widget.navigationBuilder(context),
);
case 1:
return ExcludeSemantics(
child: MobileSettingsPanel(
name: 'Addons',
builder: addonsBuilder,
builder: widget.addonsBuilder,
),
);
case 2:
return ExcludeSemantics(
child: state.isNext
? MobileSettingsPanel(
name: 'Args',
builder: argsBuilder,
builder: widget.argsBuilder,
)
: MobileSettingsPanel(
name: 'Knobs',
builder: knobsBuilder,
builder: widget.knobsBuilder,
),
);
default:
Expand Down
1 change: 1 addition & 0 deletions packages/widgetbook/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ environment:

dependencies:
accessibility_tools: ">=0.2.0 <=1.0.0"
back_button_interceptor: ^7.0.3
collection: ^1.15.0
device_frame: ^1.1.0
flutter:
Expand Down

0 comments on commit a7fcfaa

Please sign in to comment.