mayr_flutter_extensions 1.0.0
mayr_flutter_extensions: ^1.0.0 copied to clipboard
A comprehensive set of handy Flutter-specific extensions to make your Flutter code cleaner, shorter, and more expressive. Works alongside mayr_dart_extensions for complete functionality.
🧰 MayR Flutter Extensions #
Flutter-specific extension methods to supercharge your Flutter development
A comprehensive collection of Flutter-specific extension methods designed to make your Flutter code cleaner, more expressive, and easier to write. This package focuses exclusively on Flutter widgets and framework features.
📦 Package Family #
This package is part of the MayR Extensions family:
- mayr_dart_extensions - General Dart extensions for String, int, DateTime, Duration, List, Map, etc.
- mayr_flutter_extensions (this package) - Flutter-specific extensions for Widget, BuildContext, etc.
💡 Usage Together #
For Flutter applications, you'll typically want to use both packages together:
// In your pubspec.yaml
dependencies:
mayr_dart_extensions: ^1.0.0 # For general Dart utilities
mayr_flutter_extensions: ^1.0.0 # For Flutter-specific features
This separation ensures:
- ✅ Pure Dart projects can use
mayr_dart_extensions
without Flutter dependencies - ✅ Flutter projects get the best of both worlds
- ✅ No code duplication between packages
- ✅ Cleaner, more focused codebases
🚀 Installation #
Add the package to your pubspec.yaml
:
flutter pub add mayr_flutter_extensions
Or manually add it:
dependencies:
mayr_flutter_extensions: ^1.0.0
Then import it:
import 'package:mayr_flutter_extensions/mayr_flutter_extensions.dart';
✨ Features #
🧱 BuildContext Extensions #
Quickly access common Flutter objects from BuildContext
:
Navigation & State Access
// Easy access to common Flutter objects
context.navigator; // Navigator.of(context)
context.scaffold; // Scaffold.of(context)
context.form; // Form.of(context)
context.overlay; // Overlay.of(context)
context.scaffoldMessenger; // ScaffoldMessenger.of(context)
SnackBar Helper
// Show a snackbar with one line
context.showSnackBar(
'Hello World!',
duration: Duration(seconds: 2),
behavior: SnackBarBehavior.floating,
);
Media Query
// Access MediaQueryData
context.mediaQuery;
context.widgetSize; // Size of the widget
context.widgetWidth; // Width only
context.widgetHeight; // Height only
context.widgetShortestSide; // Shortest side (useful for responsive design)
Theme & Brightness
// Platform brightness
context.platformBrightness; // Brightness.dark or Brightness.light
context.platformInDarkMode; // true if dark mode
context.platformInLightMode; // true if light mode
Device Type Detection
// Responsive design helpers
context.orientation; // Portrait or landscape
context.isPortrait; // true if portrait
context.isLandscape; // true if landscape
// Device type checks
context.isPhone; // Screen width < 600
context.isSmallTablet; // 600 <= width < 720
context.isLargeTablet; // 720 <= width < 1024
context.isTablet; // isSmallTablet || isLargeTablet
context.isDesktop; // width >= 1024
🎨 Widget Extensions #
Basic Transformations
// Center a widget
Text('Hello').center();
// Make widget expanded
Container().expanded(2); // flex = 2
// Make widget flexible
Container().flexible(flex: 1);
// Add opacity
Container().opacity(0.5);
// Wrap with SizedBox
Text('Hello').sizedBox(width: 100, height: 50);
// Add constraints
Container().constrained(
maxWidth: 200,
maxHeight: 300,
);
Padding
// Add padding
Widget().paddingAll(16);
Widget().paddingSymmetric(horizontal: 20, vertical: 10);
Widget().paddingOnly(left: 8, top: 16);
Widget().paddingZero();
Clipping
// Clip widget
Container().clipRect();
Container().clipRRect(BorderRadius.circular(12));
Container().clipRounded(16); // Quick rounded corners
Positioning
// Position with Align
Widget().positionAlign(Alignment.center);
// Fill parent with Positioned.fill
Widget().positionedFill();
Visibility Helpers
final isLoggedIn = true;
final isLoading = false;
// Conditional visibility
Text('Welcome!').showIf(isLoggedIn);
Text('Please login').hideIf(isLoggedIn);
Text('Content').showUnless(isLoading);
Text('Loading...').hideUnless(isLoading);
Tap Interactions with InkWellManager
Easily add tap, double-tap, and long-press interactions to any widget:
// Simple tap
Text('Click me')
.inkWellManager(() => print('Tapped!'))
.onTap();
// With custom splash color
Container(
padding: EdgeInsets.all(16),
child: Text('Tap me'),
).inkWellManager(
() => print('Tapped!'),
color: Colors.blue,
).onTap();
// Long press
Widget().inkWellManager(() => print('Long pressed'))
.onLongPress();
// Double tap
Widget().inkWellManager(() => print('Double tapped'))
.onDoubleTap();
Why InkWellManager?
Instead of manually wrapping widgets in InkWell
every time, InkWellManager
provides quick .onTap()
, .onDoubleTap()
, and .onLongPress()
methods — making your code shorter, cleaner, and more maintainable.
🖼️ Image Extensions #
Quickly create CircleAvatar from Image widgets:
Image.network('https://example.com/avatar.jpg')
.circleAvatar(
radius: 40,
backgroundColor: Colors.grey,
);
📖 Complete Example #
import 'package:flutter/material.dart';
import 'package:mayr_flutter_extensions/mayr_flutter_extensions.dart';
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Demo')),
body: Column(
children: [
// Show info based on device type
Text('Device: ${context.isPhone ? "Phone" : "Tablet"}')
.paddingAll(16),
// Responsive container
Container(
color: Colors.blue,
child: Text('Hello'),
)
.paddingAll(8)
.opacity(0.8)
.clipRounded(12)
.center(),
// Conditional visibility
Text('Dark mode enabled!')
.showIf(context.platformInDarkMode),
// Tap interaction
Container(
padding: EdgeInsets.all(16),
color: Colors.amber,
child: Text('Tap me'),
)
.inkWellManager(() {
context.showSnackBar('Tapped!');
})
.onTap(),
],
),
);
}
}
🤝 Contributing #
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
Quick Start for Contributors #
- Fork the repository
- Create a feature branch
- Make your changes (remember: Flutter-specific extensions only!)
- Add tests for your changes
- Run tests:
flutter test
- Format code:
dart format .
- Check for issues:
dart analyze .
- Submit a pull request
📜 License #
This package is licensed under the MIT License. See LICENSE for details.
Copyright (c) 2025 MayR Labs
🌟 Support the Project #
If you find this package helpful:
- ⭐ Star the repository on GitHub
- 👍 Like it on pub.dev
- 🐛 Report issues or suggest features
- 🔀 Contribute with pull requests
- 📢 Share it with other Flutter developers
🔗 Links #
- Package: pub.dev/packages/mayr_flutter_extensions
- Repository: github.com/MayR-Labs/mayr_flutter_extensions
- Related Package: mayr_dart_extensions
- Organization: MayR Labs
- Issues: Report a bug or request a feature
Made with ❤️ by MayR Labs