rune_responsive_sizer 0.0.1
rune_responsive_sizer: ^0.0.1 copied to clipboard
Responsive-sizer bridge for the rune package. Registers .w / .h / .sp / .dm property extensions for percent-of-screen sizing.
rune_responsive_sizer #
Responsive-sizer bridge for the rune package. Registers four property extensions on a RuneConfig so source strings can size widgets relative to the screen and scale fonts with MediaQuery.textScaler:
| Property | Meaning | Example |
|---|---|---|
.w |
Percentage of screen width | 50.w → half W |
.h |
Percentage of screen height | 25.h → quarter H |
.sp |
Text-scaled pixels (respects textScaler) |
16.sp |
.dm |
Percentage of min(width, height) |
10.dm |
No new widget builders. No new value builders. No new constants. Just four entries on the extension registry.
Requirements #
- Flutter >= 3.22
- Dart >= 3.4
rune(sibling package in the same monorepo; current dep:path: ../..)
Install #
Until published on pub.flutter-io.cn, add as a sibling dep alongside rune:
dependencies:
rune:
path: ../rune
rune_responsive_sizer:
path: ../rune/packages/rune_responsive_sizer
When this package is published independently, the entry becomes a normal pub.flutter-io.cn reference.
Usage #
Construct a RuneConfig, apply the bridge via withBridges, pass to RuneView:
import 'package:flutter/material.dart';
import 'package:rune/rune.dart';
import 'package:rune_responsive_sizer/rune_responsive_sizer.dart';
final config = RuneConfig.defaults()
.withBridges(const [ResponsiveSizerBridge()]);
// then inside a widget tree:
RuneView(
source: r"""
Column(children: [
SizedBox(width: 50.w, height: 10.h, child: Text('half-W, tenth-H')),
Text('scaled', style: TextStyle(fontSize: 16.sp)),
Container(
width: 20.dm,
height: 20.dm,
color: Color(0xFF2196F3),
),
])
""",
config: config,
)
Contract notes #
ctx.flutterContextmust be non-null. All four handlers callMediaQuery.sizeOf(ctx.flutterContext!)/textScalerOf.RuneViewprovides a liveBuildContext; unit-testing a handler in isolation requires a widget pump or the handler will throwStateError.- Target must be
num.'hi'.wthrowsArgumentError. Handlers don't coerce strings to numbers. - Percentage semantics.
100.w= full width;50.w= half; values outside 0 to 100 are allowed and may produce overflow widgets (intentional: the bridge does not clamp). - Handlers return
double. Flutter's sizing APIs acceptdouble; the returned value is alwaysdoubleeven when the target is anint.
Extending #
Want more properties (.vw, .vh, .em, .rem, .dp)? Either fork this bridge into your app or contribute upstream via PR. The bridge itself is 70 lines of Dart; easy to copy and extend.
Tests #
flutter test
Seven tests cover registration, each of the four properties under fixed MediaQuery sizes, textScaler propagation, and both error paths (non-num target, null flutterContext).
License #
MIT. See LICENSE.