Files
tm_app/lib/views/shared/responsive_builder.dart
T
2025-08-09 08:18:05 +03:30

57 lines
1.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:tm_app/core/utils/breakpoints.dart';
/// A responsive builder widget that automatically switches between different
/// layouts based on the current display size.
///
/// This widget can be used by all screens to handle responsive layouts.
class ResponsiveBuilder extends StatelessWidget {
/// The widget to display on extra small screens (mobile)
final Widget? mobile;
/// The widget to display on small screens (tablet)
final Widget? tablet;
/// The widget to display on large screens (desktop)
final Widget? desktop;
/// A builder function that receives the current display size
/// Use this when you want to handle the layout logic yourself
final Widget Function(BuildContext context, DisplaySize? displaySize)?
builder;
const ResponsiveBuilder({
super.key,
this.mobile,
this.tablet,
this.desktop,
this.builder,
}) : assert(
builder != null || mobile != null,
'Either builder or at least mobile layout must be provided',
);
@override
Widget build(BuildContext context) {
final size = MediaQuery.sizeOf(context);
final displaySize = size.displaySize;
// If builder is provided, use it
if (builder != null) {
return builder!(context, displaySize);
}
// Otherwise, use the appropriate widget based on display size
return switch (displaySize) {
DisplaySize.extraSmall => mobile ?? _defaultWidget(),
DisplaySize.small => tablet ?? mobile ?? _defaultWidget(),
DisplaySize.medium => desktop ?? mobile ?? _defaultWidget(),
DisplaySize.large => desktop ?? mobile ?? _defaultWidget(),
};
}
Widget _defaultWidget() {
return const SizedBox.shrink();
}
}