Skip to main content

adaptive-dialog-dialogs

Use when showing platform-adaptive alert dialogs, confirmation dialogs, modal action sheets, or text input dialogs across iOS, Android, macOS, and Web using adaptive_dialog.

الانتقال إلى التثبيت

معلومات المصدر

المستودع
mono0926/adaptive_dialog
آخر نشاط في المصدر
٩ سبتمبر ٢٠٢٦ في ٠٣:٠٥
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٣٨٤
التفرعات
٧٢

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
adaptive_dialog-dialogs
description
Use when showing platform-adaptive alert dialogs, confirmation dialogs, modal action sheets, or text input dialogs across iOS, Android, macOS, and Web using adaptive_dialog.
# adaptive_dialog Dialogs & Action Sheets Guide `adaptive_dialog` presents dialogs and action sheets adaptively matching the host platform (Cupertino style on iOS/macOS, Material Design 3 style on Android/Web/Desktop). ## Guidelines - **Always Use Adaptive Helpers Over Raw Dialogs**: - Instead of handcrafting `showDialog(builder: (_) => AlertDialog(...))` or `showCupertinoDialog`, use `showOkAlertDialog`, `showOkCancelAlertDialog`, `showConfirmationDialog`, or `showModalActionSheet`. - **Handling Results**: - `showOkCancelAlertDialog()` returns `OkCancelResult.ok` or `OkCancelResult.cancel`. Always check `if (result == OkCancelResult.ok)` rather than comparing against boolean or null. - `showModalActionSheet<T>()` returns the generic key `T?` associated with the chosen `BottomSheetAction<T>`. It returns `null` if dismissed. - **Destructive Actions**: - Set `isDestructiveAction: true` on `BottomSheetAction` or `AlertDialogAction` for dangerous actions (e.g. Delete, Reset, Logout). This automatically applies platform-appropriate red text and emphasis. - **Text Input**: - Use `showTextInputDialog()` to solicit one or more user inputs without manually wiring `TextEditingController` boilerplate and dialog state. - **Platform Overrides (Optional)**: - If a uniform design across platforms is explicitly requested, pass `style: AdaptiveStyle.material` or `style: AdaptiveStyle.cupertino`. ## Examples ### 1. Alert & Confirmations ```dart import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter/material.dart'; Future<void> confirmAccountDeletion(BuildContext context) async { final result = await showOkCancelAlertDialog( context: context, title: 'Delete Account', message: 'Are you sure you want to delete your account? This action cannot be undone.', okLabel: 'Delete', cancelLabel: 'Cancel', isDestructiveAction: true, ); if (result == OkCancelResult.ok) { // Proceed with account deletion } } ``` ### 2. Modal Action Sheet with Generic Keys ```dart import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter/material.dart'; enum PostAction { edit, share, delete } Future<void> showPostMenu(BuildContext context) async { final action = await showModalActionSheet<PostAction>( context: context, title: 'Post Options', actions: const [ BottomSheetAction(title: 'Edit Post', key: PostAction.edit, icon: Icons.edit), BottomSheetAction(title: 'Share', key: PostAction.share, icon: Icons.share), BottomSheetAction( title: 'Delete Post', key: PostAction.delete, icon: Icons.delete, isDestructiveAction: true, ), ], ); switch (action) { case PostAction.edit: // Handle edit break; case PostAction.share: // Handle share break; case PostAction.delete: // Handle delete break; case null: // User tapped outside or dismissed break; } } ``` ### 3. Text Input Dialog ```dart import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter/material.dart'; Future<void> renameItem(BuildContext context, String currentName) async { final inputs = await showTextInputDialog( context: context, title: 'Rename Item', textFields: [ DialogTextField( initialText: currentName, hintText: 'Enter new name', validator: (value) => (value == null || value.trim().isEmpty) ? 'Name cannot be empty' : null, ), ], ); if (inputs != null && inputs.isNotEmpty) { final newName = inputs.first; print('Renamed to: $newName'); } } ``` ## Common Pitfalls & Anti-Patterns - ❌ **Anti-pattern**: Writing `Platform.isIOS ? CupertinoAlertDialog(...) : AlertDialog(...)` manually, which is fragile, misses macOS/Web adaptations, and creates repetitive boilerplate. - ✔️ **Correct**: Use `showOkAlertDialog` or `showOkCancelAlertDialog`. - ❌ **Anti-pattern**: Forgetting to check for `null` when `showModalActionSheet` is dismissed without selection. - ✔️ **Correct**: Always handle the `null` case gracefully.
عرض على GitHub