DEV Community

Cover image for Building a Custom Flutter Widget from Scratch
Harsh Bangari Rawat
Harsh Bangari Rawat

Posted on

2

Building a Custom Flutter Widget from Scratch

Flutter's magic lies in its extensive widget library. But what if you need a UI element that doesn't quite fit the mold? That's where custom widgets come in! Buckle up, Flutter developers, as we embark on a journey to build a custom widget from scratch.

Why Custom Widgets?

Custom widgets offer a treasure trove of benefits:

  • Reusability: Write your widget once, use it everywhere! This saves code, promotes consistency, and streamlines development.
  • Encapsulation: Package functionality and appearance into a neat unit, keeping your code clean and organized.
  • Customization: Tailor your widget's behavior and appearance to precisely meet your needs.

Let's Build a Star Rating Widget!

Imagine a widget that displays a row of stars, allowing users to rate something. Here's how we'll break it down:

1. Setting Up:

Create a new Flutter project and a dedicated Dart file for your widget (e.g., custom_rating_bar.dart).
Import necessary packages like flutter and material.

2. The CustomStarRating Class:

Define a class named CustomRatingBar that extends StatelessWidget.

3. Star Count and Rating Properties:

Add properties to the CustomRatingBar class:
starCount: An integer representing the total number of stars.
rating: A double representing the current user rating (optional).
filledColor: Color representing the filled color for the star.
unfilledColor: Color representing the unfilled color for the star.

4. Building the Stars:

Override the build method of the CustomRatingBar class.
Use a Row widget to display the stars horizontally.
Loop through a list based on starCount.
Inside the loop, use an Icon for each star.
Customize the Icon displayed based on the current rating (filled star for selected, unfilled star for unselected).

5. Handling User Interaction:

Set the onTap callback of the GestureDetector to update the rating property.
Consider emitting an event (using a ValueNotifier or similar) to notify parent widgets about rating changes.

6. Adding Flair (Optional):

Style your stars using Icon properties like color and size.
Implement custom animations for star selection using AnimatedIcon.

Putting it All Together:

With all the pieces in place, use the CustomRatingBar widget in your app's layout:

CustomRatingBar(starCount: 5, rating: 1.0,
                filledColor: Colors.amber,
                unfilledColor: Colors.grey,
                onRatingChanged: () {})
Enter fullscreen mode Exit fullscreen mode

custom_rating_bar.dart

import 'package:flutter/material.dart';

class CustomRatingBar extends StatefulWidget {
  final double rating;
  final int starCount;
  final Function onRatingChanged;
  final Color filledColor;
  final Color unfilledColor;

  const CustomRatingBar({
    super.key,
    required this.rating,
    required this.starCount,
    required this.onRatingChanged,
    required this.unfilledColor,
    required this.filledColor,
  });

  @override
  State<CustomRatingBar> createState() => _CustomRatingBarState();
}

class _CustomRatingBarState extends State<CustomRatingBar> {
  double _currentRating = 0.0;

  @override
  void initState() {
    super.initState();
    _currentRating = widget.rating - 1;
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: List.generate(
        widget.starCount,
        (index) => GestureDetector(
          onTap: () => _onStarTap(index.toDouble()),
          child: Icon(
            Icons.star,
            size: 30.0,
            color: _getColor(index),
          ),
        ),
      ),
    );
  }

  Color _getColor(int index) {
    if (index <= _currentRating) {
      return widget.filledColor;
    } else {
      return widget.unfilledColor;
    }
  }

  void _onStarTap(double newRating) {
    if (_currentRating == newRating) {
      newRating--;
    }
    setState(() {
      _currentRating = newRating;
      // widget.onRatingChanged(newRating);
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

This blog demonstrates a basic implementation of a custom rating bar in Flutter. It offers features like:

Star Count: You can easily adjust the number of stars displayed.
Rating: Users can tap on stars to provide their rating.
Colors: Define the desired colors and icons for filled, empty, and half-filled states (if applicable).

Further Enhancement Scopes

  • Animated Selection: The selected stars smoothly animate with a scaling effect.
  • Half Rating Support: Modify the function to include logic for displaying half-filled stars.

GitHub Code

Happy Coding!!! 🧑🏻‍💻

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️