@@ -413,14 +413,27 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
413413 // Order breakpoints from smallest to largest.
414414 // Perform ordering operation to allow breakpoints
415415 // to be accepted in any order.
416- breakpoints.sort ((a, b) => a.breakpoint.compareTo (b.breakpoint));
416+ breakpoints.sort ((a, b) {
417+ // If breakpoints are equal, return autoScaleDown
418+ // breakpoints first.
419+ if (a.breakpoint == b.breakpoint && a.isAutoScaleDown) {
420+ if (a.isAutoScaleDown) {
421+ return - 1 ;
422+ }
423+
424+ return 0 ;
425+ }
426+
427+ return a.breakpoint.compareTo (b.breakpoint);
428+ });
417429
418430 ResponsiveBreakpoint initialBreakpoint =
419431 breakpoints.firstWhere ((element) => ! element.isTag, orElse: null );
420432 ResponsiveBreakpoint breakpointHolder;
421433 // Construct breakpoint segments for initial and minWidth special cases.
422434 if (initialBreakpoint == null ||
423- initialBreakpoint.breakpoint > widget.minWidth) {
435+ (initialBreakpoint.breakpoint > widget.minWidth &&
436+ ! initialBreakpoint.isAutoScaleDown)) {
424437 // Construct two segments. 1. From 0 to the minWidth. 2. From minWidth to the next breakpoint.
425438 breakpointHolder = ResponsiveBreakpoint ._(
426439 breakpoint: widget.minWidth,
@@ -449,7 +462,11 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
449462 breakpointHolder = ResponsiveBreakpoint ._(
450463 breakpoint: initialBreakpoint.breakpoint,
451464 name: defaultBreakpoint.name,
452- behavior: defaultBreakpoint.behavior,
465+ // Special condition: return autoScale if initial
466+ // breakpoint is autoScaleDown.
467+ behavior: (initialBreakpoint.isAutoScaleDown)
468+ ? _ResponsiveBreakpointBehavior .AUTOSCALE
469+ : defaultBreakpoint.behavior,
453470 scaleFactor: defaultBreakpoint.scaleFactor);
454471 breakpointSegments.insert (
455472 0 ,
@@ -475,6 +492,44 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
475492 // Update holder with active breakpoint
476493 breakpointHolder = breakpoint;
477494 break ;
495+ case _ResponsiveBreakpointBehavior .AUTOSCALEDOWN :
496+ if (breakpointHolder.isAutoScaleDown) {
497+ breakpointSegmentHolder = _ResponsiveBreakpointSegment (
498+ breakpoint: breakpointHolder.breakpoint,
499+ responsiveBreakpointBehavior: breakpoint.behavior,
500+ responsiveBreakpoint: ResponsiveBreakpoint ._(
501+ breakpoint: breakpoint.breakpoint,
502+ name: breakpoint.name,
503+ behavior: _ResponsiveBreakpointBehavior .AUTOSCALE ,
504+ scaleFactor: breakpoint.scaleFactor));
505+ } else {
506+ // Construct midway breakpoint segment.
507+ _ResponsiveBreakpointSegment midwayBreakpointSegment =
508+ _ResponsiveBreakpointSegment (
509+ breakpoint:
510+ (breakpoint.breakpoint - breakpointHolder.breakpoint) /
511+ 2 +
512+ breakpointHolder.breakpoint,
513+ responsiveBreakpointBehavior:
514+ _ResponsiveBreakpointBehavior .AUTOSCALEDOWN ,
515+ responsiveBreakpoint: ResponsiveBreakpoint ._(
516+ breakpoint: breakpoint.breakpoint,
517+ name: breakpointHolder.name,
518+ behavior: _ResponsiveBreakpointBehavior .AUTOSCALE ,
519+ scaleFactor: breakpoint.scaleFactor));
520+ breakpointSegments.add (midwayBreakpointSegment);
521+ breakpointSegmentHolder = _ResponsiveBreakpointSegment (
522+ breakpoint: breakpoint.breakpoint,
523+ responsiveBreakpointBehavior: breakpoint.behavior,
524+ responsiveBreakpoint: ResponsiveBreakpoint ._(
525+ breakpoint: breakpoint.breakpoint,
526+ name: breakpoint.name,
527+ behavior: _ResponsiveBreakpointBehavior .AUTOSCALE ,
528+ scaleFactor: breakpoint.scaleFactor));
529+ }
530+ // Update holder with active breakpoint
531+ breakpointHolder = breakpoint;
532+ break ;
478533 case _ResponsiveBreakpointBehavior .TAG :
479534 breakpointSegmentHolder = _ResponsiveBreakpointSegment (
480535 breakpoint: breakpoint.breakpoint,
@@ -653,6 +708,7 @@ class InheritedResponsiveWrapper extends InheritedWidget {
653708enum _ResponsiveBreakpointBehavior {
654709 RESIZE ,
655710 AUTOSCALE ,
711+ AUTOSCALEDOWN ,
656712 TAG ,
657713}
658714
@@ -681,6 +737,12 @@ class ResponsiveBreakpoint {
681737 assert (breakpoint != null && breakpoint >= 0 ,
682738 'Breakpoints cannot be negative. To control behavior from 0, set `default` parameters in `ResponsiveWrapper`.' );
683739
740+ const ResponsiveBreakpoint .autoScaleDown (this .breakpoint,
741+ {this .name, this .scaleFactor = 1 })
742+ : this .behavior = _ResponsiveBreakpointBehavior .AUTOSCALEDOWN ,
743+ assert (breakpoint != null && breakpoint >= 0 ,
744+ 'Breakpoints cannot be negative. To control behavior from 0, set `default` parameters in `ResponsiveWrapper`.' );
745+
684746 const ResponsiveBreakpoint .tag (this .breakpoint, {@required this .name})
685747 : this .behavior = _ResponsiveBreakpointBehavior .TAG ,
686748 this .scaleFactor = 1 ,
@@ -705,6 +767,9 @@ class ResponsiveBreakpoint {
705767
706768 get isAutoScale => behavior == _ResponsiveBreakpointBehavior .AUTOSCALE ;
707769
770+ get isAutoScaleDown =>
771+ behavior == _ResponsiveBreakpointBehavior .AUTOSCALEDOWN ;
772+
708773 get isTag => behavior == _ResponsiveBreakpointBehavior .TAG ;
709774
710775 @override
@@ -737,6 +802,10 @@ class _ResponsiveBreakpointSegment {
737802 get isAutoScale =>
738803 responsiveBreakpointBehavior == _ResponsiveBreakpointBehavior .AUTOSCALE ;
739804
805+ get isAutoScaleDown =>
806+ responsiveBreakpointBehavior ==
807+ _ResponsiveBreakpointBehavior .AUTOSCALEDOWN ;
808+
740809 get isTag =>
741810 responsiveBreakpointBehavior == _ResponsiveBreakpointBehavior .TAG ;
742811
0 commit comments