How to Implement Bottom Sheet Modal in Flutter

In this tutorial, you will learn how to implement a bottom sheet modal in Flutter. A bottom sheet modal is a great way to display additional content or options to users without interrupting the main app flow. 

We will create a custom widget that will be displayed as a modal bottom sheet when triggered.

Flutter Bottom Sheet Modal Tutorial - Build a Custom Modal in Flutter

import 'package:flutter/material.dart';

class BottomSheetModel extends StatefulWidget {

  const BottomSheetModel({super.key});

  @override
  BottomSheetModelState createState() => BottomSheetModelState();
}

class BottomSheetModelState extends State<BottomSheetModel> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: const Center(
        child: Text("Tap button \nbelow", textAlign : TextAlign.center),
      ),
      floatingActionButton: FloatingActionButton(
        heroTag: "fab",
        backgroundColor: Theme.of(context).colorScheme.primary,
        elevation: 3,
        child: const Icon(Icons.arrow_upward, color: Colors.white,),
        onPressed: () {
          showSheet(context);
        },
      ),
    );
  }
}

void showSheet(context) {
  // Show a modal bottom sheet with the specified context and builder method.
  showModalBottomSheet(context: context, builder: (BuildContext bc) {
    return Container(
      // Define padding for the container.
      padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15),
      // Create a Wrap widget to display the sheet contents.
      child: Wrap(
        spacing: 60, // Add spacing between the child widgets.
        children: <Widget>[
          // Add a container with height to create some space.
          Container(height: 10),
          // Add a text widget with a title for the sheet.
          const Text("Flutter Material 3", style: TextStyle(fontSize: 24, fontWeight: FontWeight.w500),),
          Container(height: 10), // Add some more space.
          // Add a text widget with a long description for the sheet.
          Text(
            'Flutter is an open-source UI software development kit created by Google. It is used to develop cross-platform applications for Android, iOS, Linux, macOS, Windows, Google Fuchsia, and the web from a single codebase.',
            style: TextStyle(
                color: Colors.grey[600], // Set the text color.
                fontSize: 18 // Set the text size.
            ),
          ),
          Container(height: 10), // Add some more space.
          // Add a row widget to display buttons for closing and reading more.
          Row(
            mainAxisAlignment: MainAxisAlignment.end, // Align the buttons to the right.
            children: <Widget>[
              // Add a text button to close the sheet.
              TextButton(
                style: TextButton.styleFrom(foregroundColor: Colors.transparent,), // Make the button text transparent.
                onPressed: (){
                  Navigator.pop(context); // Close the sheet.
                },
                child: Text("CLOSE", style: TextStyle(color: Theme.of(context).colorScheme.primary)), // Add the button text.
              ),
              // Add an elevated button to read more.
              ElevatedButton(
                style: ElevatedButton.styleFrom(backgroundColor: Theme.of(context).colorScheme.primary,), // Set the button background color.
                onPressed: (){}, // Add the button onPressed function.
                child:  Text("Read More", style: TextStyle(color: Theme.of(context).colorScheme.inversePrimary)), // Add the button text.
              )
            ],
          )
        ],
      ),
    );
  });
}

..

  • Import the necessary material.dart package to use widgets and other UI elements in the code.
  • Create a stateful widget named BottomSheetModel that extends StatefulWidget. The purpose of this widget is to create a button that when clicked, will display a modal bottom sheet
  • Create a state class named BottomSheetModelState that extends State<BottomSheetModel>. The purpose of this class is to handle the state of the BottomSheetModel widget.
  • Override the build method to return a Scaffold widget that contains a Center widget with a Text widget as its child. The purpose of this is to display a button that prompts the user to open the bottom sheet.
  • Add a floatingActionButton to the Scaffold widget with an onPressed function that calls the showSheet function when the button is pressed.
  • Define the showSheet function that displays a modal bottom sheet when called. This function takes a context parameter that is required to create the modal bottom sheet.
  • Use the showModalBottomSheet method to create a modal bottom sheet with the specified context and builder method.
  • Inside the builder method, create a Container widget that defines the padding for the contents of the bottom sheet.
  • Add a Wrap widget to display the contents of the bottom sheet.
  • Add a Container widget with a height of 10 to create some space.
  • Add a Text widget with a title for the bottom sheet.
  • Add another Container widget with a height of 10 to create some more space.
  • Add a Text widget with a long description for the bottom sheet.
  • Add another Container widget with a height of 10 to create some more space.
  • Add a Row widget to display two buttons: one to close the bottom sheet and another to read more.
  • Use MainAxisAlignment.end to align the buttons to the right.
  • Add a TextButton widget to close the bottom sheet. Use the Navigator.pop method to close the bottom sheet when the button is pressed.
  • Add an ElevatedButton widget to read more. Use the onPressed function to define what happens when the button is pressed.
  • Add the necessary styles and properties to the buttons to make them look and function properly.


I hope this explanation helps you understand the code better! Let me know if you have any further questions.

..

Comments

Popular posts from this blog

Creating Beautiful Card UI in Flutter

Master Web Development with Web School Offline

Jetpack Compose - Card View