Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Add showGeneralAdaptiveDialog #101

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions example/lib/pages/general_dialog_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:example/router/router.dart';
import 'package:example/util/logger.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

class GeneralDialogRoute extends GoRouteData {
const GeneralDialogRoute();
@override
Widget build(BuildContext context, GoRouterState state) =>
const GeneralDialogPage();
}

class GeneralDialogPage extends StatelessWidget {
const GeneralDialogPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(pascalCaseFromRouteName(GoRouter.of(context).location)),
),
body: ListView(
children: <Widget>[
ListTile(
title: const Text('OK Dialog'),
onTap: () async {
final result = await showGeneralAdaptiveDialog<Object?>(
context: context,
child: Container(
width: 80,
height: 80,
color: Colors.red,
child: Column(
children: const [
Text('hello'),
],
),
),
);
logger.info(result);
},
),
],
),
);
}
}
3 changes: 3 additions & 0 deletions example/lib/router/router.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:example/pages/general_dialog_page.dart';
import 'package:example/pages/home_page.dart';
import 'package:example/pages/text_input_dialog_page.dart';
import 'package:flutter/foundation.dart';
Expand Down Expand Up @@ -25,6 +26,7 @@ final routerProvider = Provider(
TypedGoRoute<AlertRoute>(path: 'alert'),
TypedGoRoute<SheetRoute>(path: 'sheet'),
TypedGoRoute<TextInputDialogRoute>(path: 'text-input'),
TypedGoRoute<GeneralDialogRoute>(path: 'general'),
TypedGoRoute<NestedNavigatorRoute>(path: 'nested-navigator'),
],
)
Expand All @@ -40,5 +42,6 @@ List<String> get allRouteLocations => [
const AlertRoute().location,
const SheetRoute().location,
const TextInputDialogRoute().location,
const GeneralDialogRoute().location,
const NestedNavigatorRoute().location,
];
37 changes: 32 additions & 5 deletions example/lib/router/router.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions lib/adaptive_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export 'src/adaptive_dialog.dart';
export 'src/adaptive_style.dart';
export 'src/alert_dialog/alert_dialog.dart';
export 'src/general_dialog/show_general_adaptive_dialog.dart';
export 'src/modal_action_sheet/modal_action_sheet.dart';
export 'src/text_input_dialog/show_text_answer_dialog.dart';
export 'src/text_input_dialog/show_text_input_dialog.dart';
Expand Down
131 changes: 131 additions & 0 deletions lib/src/general_dialog/show_general_adaptive_dialog.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:adaptive_dialog/src/helper/macos_theme_wrapper.dart';
import 'package:animations/animations.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:macos_ui/macos_ui.dart';
import 'package:meta/meta.dart';

@useResult
Future<T?> showGeneralAdaptiveDialog<T>({
required BuildContext context,
required Widget child,
GeneralAdaptiveDialogBuilder? builder,
bool barrierDismissible = true,
AdaptiveStyle? style,
bool useRootNavigator = true,
WillPopCallback? onWillPop,
Widget? macOSApplicationIcon,
RouteSettings? routeSettings,
String? okLabel,
}) {
final navigator = Navigator.of(
context,
rootNavigator: useRootNavigator,
);
void pop(T? key) => navigator.pop(key);
final theme = Theme.of(context);
final colorScheme = theme.colorScheme;
final adaptiveStyle = style ?? AdaptiveDialog.instance.defaultStyle;
final effectiveStyle = adaptiveStyle.effectiveStyle(theme);
switch (effectiveStyle) {
// ignore: deprecated_member_use, deprecated_member_use_from_same_package
case AdaptiveStyle.cupertino:
case AdaptiveStyle.iOS:
return showCupertinoDialog(
context: context,
useRootNavigator: useRootNavigator,
routeSettings: routeSettings,
builder: (context) {
final dialog = WillPopScope(
onWillPop: onWillPop,
child: CupertinoAlertDialog(
title: child,
content: const SizedBox(),
actions: [
CupertinoDialogAction(
isDefaultAction: true,
onPressed: () => pop(null),
child: Text(
okLabel ?? MaterialLocalizations.of(context).okButtonLabel,
),
),
],
),
);
return builder == null
? dialog
: builder(context, effectiveStyle, dialog);
},
);
case AdaptiveStyle.macOS:
return showMacosAlertDialog(
context: context,
useRootNavigator: useRootNavigator,
routeSettings: routeSettings,
builder: (context) {
final Widget dialog = MacThemeWrapper(
child: WillPopScope(
onWillPop: onWillPop,
child: MacosAlertDialog(
title: child,
message: const SizedBox.shrink(),
appIcon: macOSApplicationIcon ??
AdaptiveDialog.instance.macOS.applicationIcon ??
const Icon(Icons.info),
primaryButton: PushButton(
buttonSize: ButtonSize.large,
// isSecondary: isDestructiveAction || !isDefaultAction,
onPressed: () => pop(null),
child: Text(
okLabel ?? MaterialLocalizations.of(context).okButtonLabel,
),
),
),
),
);
return builder == null
? dialog
: builder(context, effectiveStyle, dialog);
},
);
case AdaptiveStyle.material:
return showModal(
context: context,
useRootNavigator: useRootNavigator,
routeSettings: routeSettings,
configuration: FadeScaleTransitionConfiguration(
barrierDismissible: barrierDismissible,
),
builder: (context) {
final dialog = WillPopScope(
onWillPop: onWillPop,
child: AlertDialog(
content: child,
actions: [
TextButton(
child: Text(
okLabel ?? MaterialLocalizations.of(context).okButtonLabel,
),
onPressed: () => pop(null),
)
],
),
);
return builder == null
? dialog
: builder(context, effectiveStyle, dialog);
},
);
case AdaptiveStyle.adaptive:
assert(false);
return Future.value();
}
}

// TODO(mono): 順番あってる?
typedef GeneralAdaptiveDialogBuilder = Widget Function(
BuildContext context,
AdaptiveStyle style,
Widget child,
);