// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/cupertino.dart'; import '../../gallery/demo.dart'; class CupertinoAlertDemo extends StatefulWidget { const CupertinoAlertDemo({super.key}); static const String routeName = '/cupertino/alert'; @override State createState() => _CupertinoAlertDemoState(); } class _CupertinoAlertDemoState extends State { String? lastSelectedValue; void showDemoDialog({required BuildContext context, Widget? child}) { showCupertinoDialog(context: context, builder: (BuildContext context) => child!).then(( String? value, ) { if (value != null) { setState(() { lastSelectedValue = value; }); } }); } void showDemoActionSheet({required BuildContext context, Widget? child}) { showCupertinoModalPopup( context: context, builder: (BuildContext context) => child!, ).then((String? value) { if (value != null) { setState(() { lastSelectedValue = value; }); } }); } @override Widget build(BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( middle: const Text('Alerts'), // We're specifying a back label here because the previous page is a // Material page. CupertinoPageRoutes could auto-populate these back // labels. previousPageTitle: 'Cupertino', trailing: CupertinoDemoDocumentationButton(CupertinoAlertDemo.routeName), ), child: DefaultTextStyle( style: CupertinoTheme.of(context).textTheme.textStyle, child: Builder( builder: (BuildContext context) { return Stack( alignment: Alignment.center, children: [ CupertinoScrollbar( child: ListView( primary: true, // Add more padding to the normal safe area. padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0) + MediaQuery.of(context).padding, children: [ CupertinoButton.filled( child: const Text('Alert'), onPressed: () => _onAlertPress(context), ), const Padding(padding: EdgeInsets.all(8.0)), CupertinoButton.filled( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), child: const Text('Alert with Title'), onPressed: () => _onAlertWithTitlePress(context), ), const Padding(padding: EdgeInsets.all(8.0)), CupertinoButton.filled( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), child: const Text('Alert with Buttons'), onPressed: () => _onAlertWithButtonsPress(context), ), const Padding(padding: EdgeInsets.all(8.0)), CupertinoButton.filled( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), child: const Text('Alert Buttons Only'), onPressed: () { showDemoDialog(context: context, child: const CupertinoDessertDialog()); }, ), const Padding(padding: EdgeInsets.all(8.0)), CupertinoButton.filled( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0), child: const Text('Action Sheet'), onPressed: () => _onActionSheetPress(context), ), ], ), ), if (lastSelectedValue != null) Positioned(bottom: 32.0, child: Text('You selected: $lastSelectedValue')), ], ); }, ), ), ); } void _onAlertPress(BuildContext context) { showDemoDialog( context: context, child: CupertinoAlertDialog( title: const Text('Discard draft?'), actions: [ CupertinoDialogAction( isDestructiveAction: true, child: const Text('Discard'), onPressed: () => Navigator.pop(context, 'Discard'), ), CupertinoDialogAction( isDefaultAction: true, child: const Text('Cancel'), onPressed: () => Navigator.pop(context, 'Cancel'), ), ], ), ); } void _onAlertWithTitlePress(BuildContext context) { showDemoDialog( context: context, child: CupertinoAlertDialog( title: const Text('Allow "Maps" to access your location while you are using the app?'), content: const Text( 'Your current location will be displayed on the map and used ' 'for directions, nearby search results, and estimated travel times.', ), actions: [ CupertinoDialogAction( child: const Text("Don't Allow"), onPressed: () => Navigator.pop(context, 'Disallow'), ), CupertinoDialogAction( child: const Text('Allow'), onPressed: () => Navigator.pop(context, 'Allow'), ), ], ), ); } void _onAlertWithButtonsPress(BuildContext context) { showDemoDialog( context: context, child: const CupertinoDessertDialog( title: Text('Select Favorite Dessert'), content: Text( 'Please select your favorite type of dessert from the ' 'list below. Your selection will be used to customize the suggested ' 'list of eateries in your area.', ), ), ); } void _onActionSheetPress(BuildContext context) { showDemoActionSheet( context: context, child: CupertinoActionSheet( title: const Text('Favorite Dessert'), message: const Text('Please select the best dessert from the options below.'), actions: [ CupertinoActionSheetAction( child: const Text('Profiteroles'), onPressed: () => Navigator.pop(context, 'Profiteroles'), ), CupertinoActionSheetAction( child: const Text('Cannolis'), onPressed: () => Navigator.pop(context, 'Cannolis'), ), CupertinoActionSheetAction( child: const Text('Trifle'), onPressed: () => Navigator.pop(context, 'Trifle'), ), ], cancelButton: CupertinoActionSheetAction( isDefaultAction: true, child: const Text('Cancel'), onPressed: () => Navigator.pop(context, 'Cancel'), ), ), ); } } class CupertinoDessertDialog extends StatelessWidget { const CupertinoDessertDialog({super.key, this.title, this.content}); final Widget? title; final Widget? content; @override Widget build(BuildContext context) { return CupertinoAlertDialog( title: title, content: content, actions: [ CupertinoDialogAction( child: const Text('Cheesecake'), onPressed: () { Navigator.pop(context, 'Cheesecake'); }, ), CupertinoDialogAction( child: const Text('Tiramisu'), onPressed: () { Navigator.pop(context, 'Tiramisu'); }, ), CupertinoDialogAction( child: const Text('Apple Pie'), onPressed: () { Navigator.pop(context, 'Apple Pie'); }, ), CupertinoDialogAction( child: const Text("Devil's food cake"), onPressed: () { Navigator.pop(context, "Devil's food cake"); }, ), CupertinoDialogAction( child: const Text('Banana Split'), onPressed: () { Navigator.pop(context, 'Banana Split'); }, ), CupertinoDialogAction( child: const Text('Oatmeal Cookie'), onPressed: () { Navigator.pop(context, 'Oatmeal Cookies'); }, ), CupertinoDialogAction( child: const Text('Chocolate Brownie'), onPressed: () { Navigator.pop(context, 'Chocolate Brownies'); }, ), CupertinoDialogAction( isDestructiveAction: true, child: const Text('Cancel'), onPressed: () { Navigator.pop(context, 'Cancel'); }, ), ], ); } }