How to Create Checkbox in Flutter? (Multiple Ways)

In this blog post, we’ll explore three different approaches to implementing a Checkbox in Flutter, each with its advantages and use cases.

Among these, the Checkbox widget is commonly used for capturing binary user choices.

Checkboxes allow users to select one or more items from a list of options, making them an essential component in forms, settings screens, and more. In Flutter, checkboxes are represented by the Checkbox widget, which provides properties for customization and event handling.

Create Checkbox in Flutter

3 Ways to Create Checkbox in Flutter

Approach 1: Using ListTile for the Checkbox in Flutter

The first approach involves using the ListTile widget, which provides a convenient way to display a row with leading and trailing widgets, typically used in lists.

We can place a Checkbox widget as the leading widget and a RichText widget containing the label text as the title. This approach simplifies the layout and is suitable for scenarios where the checkbox is part of a list or a similar structure.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Terms and Conditions'),
      ),
      body: Center(
        child: TermsAndConditionsWidget(),
      ),
    ),
  ));
}

class TermsAndConditionsWidget extends StatefulWidget {
  @override
  _TermsAndConditionsWidgetState createState() => _TermsAndConditionsWidgetState();
}

class _TermsAndConditionsWidgetState extends State<TermsAndConditionsWidget> {
  bool agreedToTerms = false;

  @override
  Widget build(BuildContext context) {
    return ListTile(
      leading: Checkbox(
        activeColor: Colors.yellow,
        checkColor: Colors.black,
        value: agreedToTerms,
        onChanged: (newValue) {
          setState(() {
            agreedToTerms = newValue!;
          });
        },
      ),
      title: RichText(
        text: TextSpan(
          text: 'I have read and agree ',
          style: Theme.of(context).textTheme.bodyMedium,
          children: <TextSpan>[
            TextSpan(
              text: "Terms & Conditions ",
              style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.bold),
            ),
            TextSpan(
              text: "of the Application",
              style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.bold),
            ),
          ],
        ),
      ),
    );
  }
}

Approach 2: Use Row and Expanded for the Checkbox in Flutter

The second approach employs a Row widget with two children: a Checkbox widget and an Expanded widget containing a GestureDetector with a RichText child.

The Expanded widget ensures that RichText fills the available space, allowing users to tap anywhere on the text to toggle the checkbox state.

This approach offers more flexibility in terms of layout customization and is suitable for standalone checkbox components.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Terms and Conditions'),
      ),
      body: Center(
        child: TermsAndConditionsWidget(),
      ),
    ),
  ));
}

class TermsAndConditionsWidget extends StatefulWidget {
  @override
  _TermsAndConditionsWidgetState createState() => _TermsAndConditionsWidgetState();
}

class _TermsAndConditionsWidgetState extends State<TermsAndConditionsWidget> {
  bool agreedToTerms = false;

  @override
  Widget build(BuildContext context) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Checkbox(
          activeColor: Colors.yellow,
          checkColor: Colors.black,
          value: agreedToTerms,
          onChanged: (newValue) {
            setState(() {
              agreedToTerms = newValue!;
            });
          },
        ),
        Expanded(
          child: GestureDetector(
            onTap: () {
              setState(() {
                agreedToTerms = !agreedToTerms;
              });
            },
            child: Padding(
              padding: const EdgeInsets.symmetric(vertical: 8.0),
              child: RichText(
                text: TextSpan(
                  text: 'I have read and agree ',
                  style: Theme.of(context).textTheme.bodyMedium,
                  children: <TextSpan>[
                    TextSpan(
                      text: "Terms & Conditions ",
                      style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.bold),
                    ),
                    TextSpan(
                      text: "of the Application",
                      style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.bold),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }
}

Approach 3: Checkbox widget with Adjustments

The third approach revisits the original code provided by the user, making necessary adjustments for clarity and completeness.

It uses a Row widget with a Checkbox widget and a SizedBox containing a RichText widget.

This straightforward approach may be preferred if the layout requirements match the provided code structure.

import 'package:flutter/material.dart';

class TermsAndConditionsWidget extends StatefulWidget {
  @override
  _TermsAndConditionsWidgetState createState() =>
      _TermsAndConditionsWidgetState();
}

class _TermsAndConditionsWidgetState extends State<TermsAndConditionsWidget> {
  bool agreedToTerms = false;

  @override
  Widget build(BuildContext context) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisAlignment: MainAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        Checkbox(
          activeColor: Colors.yellow,
          checkColor: Colors.black,
          value: agreedToTerms,
          onChanged: (newValue) {
            setState(() {
              agreedToTerms = newValue!;
            });
          },
        ),
        SizedBox(
          width: MediaQuery.of(context).size.width / 1.6,
          child: RichText(
            text: TextSpan(
              text: 'I have read and agree ',
              style: Theme.of(context).textTheme.bodyMedium,
              children: <TextSpan>[
                TextSpan(
                  text: "Terms & Conditions ",
                  style: Theme.of(context)
                      .textTheme
                      .bodyMedium
                      ?.copyWith(fontWeight: FontWeight.bold),
                ),
                TextSpan(
                  text: "of the Application",
                  style: Theme.of(context)
                      .textTheme
                      .bodyMedium
                      ?.copyWith(fontWeight: FontWeight.bold),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Terms and Conditions'),
      ),
      body: Center(
        child: TermsAndConditionsWidget(),
      ),
    ),
  ));
}

Output of all approaches:

Output of check box in flutter

Also Read:

At the End

This blog post explored three different approaches to implementing a Checkbox in Flutter. Each approach offers its own set of advantages and can be tailored to suit specific use cases.

Whether you’re building a simple form or a complex user interface, understanding these approaches will empower you to create interactive and user-friendly applications with Flutter.

You can visit Flutter’s official documentation for more.

Share:
Ambika Dulal

Ambika Dulal is a Flutter Developer from Nepal who is passionate about building beautiful and user-friendly apps. She is always looking for new challenges and is eager to learn new things. She is also a strong believer in giving back to the community and is always willing to help others.

Leave a Comment

AO Logo

App Override is a leading mobile app development company based in Kathmandu, Nepal. Specializing in both Android and iOS app development, the company has established a strong reputation for delivering high-quality and innovative mobile solutions to clients across a range of industries.

Services

UI/UX Design

Custom App Development

Mobile Strategy Consulting

App Testing and Quality Assurance

App Maintenance and Support

App Marketing and Promotion

Contact

App Override

New Plaza, Kathmandu