DEV Community

Sudhanshu Kumar Yadav
Sudhanshu Kumar Yadav

Posted on

Flutter's Hidden Treasures: Unearthing Rare Widgets and Their Use Cases πŸ—οΈ

Unlocking the secrets of lesser-known Flutter widgets and how to use them!


Ahoy, Flutter adventurers! πŸ‘‹

Are you ready to embark on a thrilling adventure to uncover the hidden treasures of the Flutter widget universe? You've come to the right place! πŸ—ΊοΈ Join me as we shine a light on some of the rarely used widgets that might just turn out to be the secret weapons in your Flutter arsenal, today we will not only uncover hidden widget treasures but also explore their fascinating use cases! πŸ”

1. IntrinsicWidth & IntrinsicHeight: Masters of Dimensions πŸ“

Use Case:
Suppose you're building a news app, and you have an article widget that displays a varying amount of text. To ensure that the widget sizes itself based on the content, you can use IntrinsicWidth and IntrinsicHeight:

IntrinsicHeight(
  child: IntrinsicWidth(
    child: Container(
      decoration: BoxDecoration(border: Border.all(color: Colors.blue)),
      child: Text(
        'Breaking news: Flutter is awesome!',
        style: TextStyle(fontSize: 24),
      ),
    ),
  ),
)
Enter fullscreen mode Exit fullscreen mode

2. Flow: The Artful Dodger 🎨

Use Case:
Imagine you're designing a photo editing app, and you want to create a custom layout for a set of filter icons that follow a curved path. You can use Flow and a custom FlowDelegate to achieve this:

class CurvedPathFlowDelegate extends FlowDelegate {
  @override
  void paintChildren(FlowPaintingContext context) {
    final double radius = 100;
    final double iconSize = 50;
    for (int i = 0; i < context.childCount; i++) {
      final double theta = (i / (context.childCount - 1)) * pi;
      final double x = radius * (1 + cos(theta)) - iconSize / 2;
      final double y = radius * (1 + sin(theta)) - iconSize / 2;
      context.paintChild(i, transform: Matrix4.translationValues(x, y, 0));
    }
  }

  @override
  bool shouldRepaint(CurvedPathFlowDelegate oldDelegate) => false;
}

Flow(
  delegate: CurvedPathFlowDelegate(),
  children: [
    Icon(Icons.filter_1, size: 50),
    Icon(Icons.filter_2, size: 50),
    Icon(Icons.filter_3, size: 50),
  ],
)
Enter fullscreen mode Exit fullscreen mode

3. InteractiveViewer: The Pan and Zoom Prodigy πŸ”

Use Case:
Let's say you're building a maps app, and you want to allow users to zoom in and pan around a map image. You can use InteractiveViewer to achieve this functionality:

InteractiveViewer(
  minScale: 0.1,
  maxScale: 4,
  child: Image.network('https://example.com/map_image.jpg'),
)
Enter fullscreen mode Exit fullscreen mode

4. DraggableScrollableSheet: The Shape-Shifting Scroller πŸ“œ

Use Case:
Imagine you're creating a ride-hailing app, and you want to display a draggable panel that reveals more information about a selected driver when expanded. You can use DraggableScrollableSheet to create this effect:

DraggableScrollableSheet(
  initialChildSize: 0.3,
  minChildSize: 0.2,
  maxChildSize: 0.6,
  builder: (BuildContext context, ScrollController scrollController) {
    return SingleChildScrollView(
      controller: scrollController,
      child: Column(
        children: [
          Icon(Icons.drag_handle),
          ListTile(
            title: "Text('Driver Name'),"
            subtitle: "Text('4.8 β˜…'),"
          ),
          // Add more information about the driver here.
        ],
      ),
    );
  },
)
Enter fullscreen mode Exit fullscreen mode

5. Placeholder: The Invisible Chameleon 🦎

Use Case:
Suppose you're building a social media app and are still working on the user profile section. Instead of displaying empty space, you can use a Placeholder widget to indicate where the profile picture will be placed:

Placeholder(
  fallbackWidth: 100,
  fallbackHeight: 100,,
  strokeWidth: 2,
  color: Colors.grey,
)
Enter fullscreen mode Exit fullscreen mode

6. FractionallySizedBox: The Relative Sizer πŸ§™β€β™‚οΈ

FractionallySizedBox is a magical widget that can resize its child based on a fraction of the parent's size. This wizardry allows you to create responsive layouts that gracefully adapt to different screen sizes and orientations.

Use Case:
Imagine you're building a responsive dashboard, andyou want a widget to always take up 70% of the screen width, regardless of the device's screen size. You can achieve this with a FractionallySizedBox:

FractionallySizedBox(
  widthFactor: 0.7,
  child: DashboardWidget(),
)
Enter fullscreen mode Exit fullscreen mode

7. ValueListenableBuilder: The Reactive Listener 🦻

ValueListenableBuilder is like an attentive listener, always ready to react to changes in its ValueListenable source. With this widget, you can efficiently rebuild only the parts of your UI that depend on a specific value, instead of rebuilding the entire widget tree.

Use Case:
Suppose you have a counter app, and you want to display the current count without rebuilding the entire UI when the value changes. You can use a ValueListenableBuilder to accomplish this and a great way to build the counter app without the Stateful Widget:

final ValueNotifier<int> counter = ValueNotifier<int>(0);

ValueListenableBuilder(
  valueListenable: counter,
  builder: (BuildContext context, int value, Widget? child) {
    return Text('Counter: $value');
  },
)
Enter fullscreen mode Exit fullscreen mode

And that's a wrap, Flutter explorers! πŸŽ‰ We've embarked on an adventure through the lesser-known corners of the Flutter widget world, uncovering hidden gems and their fascinating use cases. Armed with this newfound knowledge, you can now create even more stunning and versatile user interfaces for your apps.

Remember, the key to mastering Flutter lies in exploring and experimenting with different widgets. Don't be afraid to step out of your comfort zone and dive into the world of rare and unique widgets. Happy coding, and until our next adventure! πŸš€πŸ’»

Top comments (0)