UniSize

Fuel Me with Coffee

A comprehensive Flutter package for responsive UI design with universal sizing units that work consistently across all platforms. UniSize provides .dp for sizes and .sp for fonts with automatic scaling based on screen density and text scale factors.

Features

Universal Sizing: .dp for all sizes, .sp for fonts
Cross-Platform: Works consistently on Android, iOS, Web, Windows, macOS, and Linux
Responsive Design: Automatic scaling based on screen size and density
Text Scaling: Respects system text scale while maintaining readability
Screen Type Detection: Mobile, tablet, and desktop detection
Orientation Support: Portrait and landscape orientation handling
Easy Integration: Simple setup with minimal configuration

Installation

Add uni_size to your pubspec.yaml:

dependencies:
  uni_size: ^1.0.0

Then run:

flutter pub get

Quick Start

1. Wrap your app with UniSizeWidget

import 'package:flutter/material.dart';
import 'package:uni_size/uni_size.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return UniSizeWidget(
      designWidth: 375,  // Your design width (optional, default: 375)
      designHeight: 812, // Your design height (optional, default: 812)
      builder: (context, orientation, screenType) {
        return MaterialApp(
          title: 'UniSize Demo',
          home: MyHomePage(),
        );
      },
    );
  }
}

2. Use .dp for sizes and .sp for fonts

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'UniSize Demo',
          style: TextStyle(fontSize: 18.sp), // Use .sp for fonts
        ),
      ),
      body: Container(
        width: 200.dp,        // Use .dp for sizes
        height: 100.dp,       // Use .dp for sizes
        padding: EdgeInsets.all(16.dp), // Use .dp for padding
        margin: EdgeInsets.symmetric(
          horizontal: 20.dp,  // Use .dp for margins
          vertical: 10.dp,
        ),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(8.dp), // Use .dp for radius
        ),
        child: Text(
          'Hello UniSize!',
          style: TextStyle(
            fontSize: 16.sp,    // Use .sp for font size
            height: 1.5,        // Line height can remain unitless
          ),
        ),
      ),
    );
  }
}

Advanced Usage

Manual Initialization (Alternative)

If you prefer not to use UniSizeWidget, you can manually initialize:

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Builder(
        builder: (context) {
          // Initialize UniSize
          initUniSize(context, designWidth: 375, designHeight: 812);
          
          return MyHomePage();
        },
      ),
    );
  }
}

Responsive Design

Create different layouts for different screen types:

Widget build(BuildContext context) {
  return ResponsiveBuilder(
    mobile: MobileLayout(),
    tablet: TabletLayout(),
    desktop: DesktopLayout(),
  );
}

Or use responsive values:

final padding = EdgeInsets.all(
  16.responsive(
    mobile: 12.dp,
    tablet: 16.dp,
    desktop: 20.dp,
  ),
);

Orientation Handling

Widget build(BuildContext context) {
  return OrientationResponsive(
    portrait: PortraitLayout(),
    landscape: LandscapeLayout(),
  );
}

Device Information

Access device information anywhere in your app:

Widget build(BuildContext context) {
  return Column(
    children: [
      if (context.isMobile) Text('Mobile Device'),
      if (context.isTablet) Text('Tablet Device'),
      if (context.isDesktop) Text('Desktop Device'),
      if (context.isPortrait) Text('Portrait Mode'),
      if (context.isLandscape) Text('Landscape Mode'),
    ],
  );
}

Conditional Widgets

Show or hide widgets based on screen type:

ConditionalWidget(
  condition: context.isMobile,
  child: MobileOnlyWidget(),
  fallback: DesktopWidget(),
)

API Reference

Libraries

uni_size