Widgets

मोडल

परिचय

Nylo Website बॉटम शीट मोडल पर आधारित एक मोडल सिस्टम प्रदान करता है।

BottomSheetModal क्लास आपको एक्शन, हेडर, बंद करने के बटन, और कस्टम स्टाइलिंग के साथ कंटेंट ओवरले प्रदर्शित करने के लिए एक लचीला API देता है।

मोडल इनके लिए उपयोगी हैं:

  • पुष्टिकरण डायलॉग (उदा., लॉगआउट, डिलीट)
  • त्वरित इनपुट फ़ॉर्म
  • कई विकल्पों वाली एक्शन शीट
  • सूचनात्मक ओवरले

मोडल बनाना

आप Metro CLI का उपयोग करके नया मोडल बना सकते हैं:

metro make:bottom_sheet_modal payment_options

यह दो चीज़ें बनाता है:

  1. एक मोडल कंटेंट विजेट lib/resources/widgets/bottom_sheet_modals/modals/payment_options_modal.dart पर:
import 'package:flutter/material.dart';

/// Payment Options Modal
///
/// Used in BottomSheetModal.showPaymentOptions()
class PaymentOptionsModal extends StatelessWidget {
  const PaymentOptionsModal({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('PaymentOptionsModal').headingLarge(),
      ],
    );
  }
}
  1. एक स्टैटिक मेथड आपकी BottomSheetModal क्लास में lib/resources/widgets/bottom_sheet_modals/bottom_sheet_modals.dart में जोड़ा जाता है:
/// Show Payment Options modal
static Future<void> showPaymentOptions(BuildContext context) {
  return displayModal(
    context,
    isScrollControlled: false,
    child: const PaymentOptionsModal(),
  );
}

इसके बाद आप मोडल को कहीं से भी कॉल कर सकते हैं:

BottomSheetModal.showPaymentOptions(context);

यदि समान नाम का मोडल पहले से मौजूद है, तो इसे ओवरराइट करने के लिए --force फ़्लैग का उपयोग करें:

metro make:bottom_sheet_modal payment_options --force

बुनियादी उपयोग

BottomSheetModal का उपयोग करके मोडल प्रदर्शित करें:

BottomSheetModal.showLogout(context);

मोडल बनाना

अनुशंसित पैटर्न एक BottomSheetModal क्लास बनाना है जिसमें प्रत्येक मोडल प्रकार के लिए स्टैटिक मेथड हों। बॉयलरप्लेट यह संरचना प्रदान करता है:

import 'package:flutter/material.dart';
import 'package:nylo_framework/nylo_framework.dart';

class BottomSheetModal extends NyBaseModal {
  static ModalShowFunction get displayModal => displayModal;

  /// Show Logout modal
  static Future<void> showLogout(
    BuildContext context, {
    Function()? onLogoutPressed,
    Function()? onCancelPressed,
  }) {
    return displayModal(
      context,
      isScrollControlled: false,
      child: const LogoutModal(),
      actionsRow: [
        Button.secondary(
          text: "Logout",
          onPressed: onLogoutPressed ?? () => routeToInitial(),
        ),
        Button(
          text: "Cancel",
          onPressed: onCancelPressed ?? () => Navigator.pop(context),
        ),
      ],
    );
  }
}

इसे कहीं से भी कॉल करें:

BottomSheetModal.showLogout(context);

// With custom callbacks
BottomSheetModal.showLogout(
  context,
  onLogoutPressed: () {
    // Custom logout logic
  },
  onCancelPressed: () {
    Navigator.pop(context);
  },
);

BottomSheetModal

displayModal<T>() मोडल प्रदर्शित करने का मुख्य मेथड है।

पैरामीटर

पैरामीटर टाइप डिफ़ॉल्ट विवरण
context BuildContext आवश्यक मोडल के लिए बिल्ड कॉन्टेक्स्ट
child Widget आवश्यक मुख्य कंटेंट विजेट
actionsRow List<Widget> [] क्षैतिज पंक्ति में प्रदर्शित एक्शन विजेट
actionsColumn List<Widget> [] लंबवत रूप से प्रदर्शित एक्शन विजेट
height double? null मोडल की निश्चित ऊँचाई
header Widget? null शीर्ष पर हेडर विजेट
useSafeArea bool true कंटेंट को SafeArea में लपेटें
isScrollControlled bool false मोडल को स्क्रॉल करने योग्य बनाएँ
showCloseButton bool false X बंद करने का बटन दिखाएँ
headerPadding EdgeInsets? null हेडर मौजूद होने पर पैडिंग
backgroundColor Color? null मोडल का बैकग्राउंड रंग
showHandle bool true शीर्ष पर ड्रैग हैंडल दिखाएँ
closeButtonColor Color? null बंद बटन का बैकग्राउंड रंग
closeButtonIconColor Color? null बंद बटन का आइकन रंग
modalDecoration BoxDecoration? null मोडल कंटेनर के लिए कस्टम डेकोरेशन
handleColor Color? null ड्रैग हैंडल का रंग

एक्शन

एक्शन मोडल के नीचे प्रदर्शित बटन हैं।

पंक्ति एक्शन एक-दूसरे के बगल में रखे जाते हैं, प्रत्येक को समान स्थान मिलता है:

displayModal(
  context,
  child: Text("Are you sure?"),
  actionsRow: [
    ElevatedButton(
      onPressed: () => Navigator.pop(context, true),
      child: Text("Yes"),
    ),
    TextButton(
      onPressed: () => Navigator.pop(context, false),
      child: Text("No"),
    ),
  ],
);

कॉलम एक्शन लंबवत रूप से एक के ऊपर एक रखे जाते हैं:

displayModal(
  context,
  child: Text("Choose an option"),
  actionsColumn: [
    ElevatedButton(
      onPressed: () => Navigator.pop(context, true),
      child: Text("Yes"),
    ),
    TextButton(
      onPressed: () => Navigator.pop(context, false),
      child: Text("No"),
    ),
  ],
);

हेडर

मुख्य कंटेंट के ऊपर हेडर जोड़ें:

displayModal(
  context,
  header: Container(
    padding: EdgeInsets.all(16),
    color: Colors.blue,
    child: Text(
      "Modal Title",
      style: TextStyle(color: Colors.white, fontSize: 18),
    ),
  ),
  child: Text("Modal content goes here"),
);

बंद करने का बटन

ऊपरी-दाएँ कोने में बंद करने का बटन प्रदर्शित करें:

displayModal(
  context,
  showCloseButton: true,
  closeButtonColor: Colors.grey.shade200,
  closeButtonIconColor: Colors.black,
  child: Padding(
    padding: EdgeInsets.all(24),
    child: Text("Content with close button"),
  ),
);

कस्टम डेकोरेशन

मोडल कंटेनर की दिखावट को कस्टमाइज़ करें:

displayModal(
  context,
  backgroundColor: Colors.transparent,
  modalDecoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
    boxShadow: [
      BoxShadow(color: Colors.black26, blurRadius: 10),
    ],
  ),
  handleColor: Colors.grey.shade400,
  child: Text("Custom styled modal"),
);

BottomModalSheetStyle

BottomModalSheetStyle फ़ॉर्म पिकर और अन्य कॉम्पोनेंट द्वारा उपयोग किए जाने वाले बॉटम शीट मोडल की दिखावट को कॉन्फ़िगर करता है:

BottomModalSheetStyle(
  backgroundColor: NyColor(light: Colors.white, dark: Colors.grey.shade900),
  barrierColor: NyColor(light: Colors.black54, dark: Colors.black87),
  useRootNavigator: false,
  titleStyle: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
  itemStyle: TextStyle(fontSize: 16),
  clearButtonStyle: TextStyle(color: Colors.red),
)
प्रॉपर्टी टाइप विवरण
backgroundColor NyColor? मोडल का बैकग्राउंड रंग
barrierColor NyColor? मोडल के पीछे ओवरले का रंग
useRootNavigator bool रूट नेविगेटर का उपयोग करें (डिफ़ॉल्ट: false)
routeSettings RouteSettings? मोडल के लिए रूट सेटिंग्स
titleStyle TextStyle? शीर्षक टेक्स्ट की स्टाइल
itemStyle TextStyle? सूची आइटम टेक्स्ट की स्टाइल
clearButtonStyle TextStyle? क्लियर बटन टेक्स्ट की स्टाइल

उदाहरण

पुष्टिकरण मोडल

static Future<bool?> showConfirm(
  BuildContext context, {
  required String message,
}) {
  return displayModal<bool>(
    context,
    child: Padding(
      padding: EdgeInsets.symmetric(vertical: 16),
      child: Text(message, textAlign: TextAlign.center),
    ),
    actionsRow: [
      ElevatedButton(
        onPressed: () => Navigator.pop(context, true),
        child: Text("Confirm"),
      ),
      TextButton(
        onPressed: () => Navigator.pop(context, false),
        child: Text("Cancel"),
      ),
    ],
  );
}

// Usage
bool? confirmed = await BottomSheetModal.showConfirm(
  context,
  message: "Delete this item?",
);
if (confirmed == true) {
  // delete the item
}

स्क्रॉल करने योग्य कंटेंट मोडल

displayModal(
  context,
  isScrollControlled: true,
  height: MediaQuery.of(context).size.height * 0.8,
  showCloseButton: true,
  header: Padding(
    padding: EdgeInsets.all(16),
    child: Text("Terms of Service", style: TextStyle(fontSize: 20)),
  ),
  child: SingleChildScrollView(
    child: Text(longTermsText),
  ),
);

एक्शन शीट

displayModal(
  context,
  showHandle: true,
  child: Text("Share via", style: TextStyle(fontSize: 18)),
  actionsColumn: [
    ListTile(
      leading: Icon(Icons.email),
      title: Text("Email"),
      onTap: () {
        Navigator.pop(context);
        shareViaEmail();
      },
    ),
    ListTile(
      leading: Icon(Icons.message),
      title: Text("Message"),
      onTap: () {
        Navigator.pop(context);
        shareViaMessage();
      },
    ),
    ListTile(
      leading: Icon(Icons.copy),
      title: Text("Copy Link"),
      onTap: () {
        Navigator.pop(context);
        copyLink();
      },
    ),
  ],
);