From 2b3099c814cbffbdd16ee148acbc0e969f64d326 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Fri, 29 Jul 2016 15:28:40 -0700 Subject: [PATCH] Always select a diagonal for ArcTween even if begin and end rects are equal (#5151) Fixes https://github.com/flutter/flutter/issues/5086 --- .../lib/src/foundation/basic_types.dart | 18 ++++++++++++++++++ packages/flutter/lib/src/material/arc.dart | 10 ++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/foundation/basic_types.dart b/packages/flutter/lib/src/foundation/basic_types.dart index 1884faabc8c..a6d2ec009e1 100644 --- a/packages/flutter/lib/src/foundation/basic_types.dart +++ b/packages/flutter/lib/src/foundation/basic_types.dart @@ -243,3 +243,21 @@ class _LazyListIterator implements Iterator { return true; } } + +// COLLECTION UTILITIES + +typedef dynamic KeyFunc(T input); + +/// Select the element for which the key function returns the maximum value. +dynamic/*=T*/ maxBy/**/(Iterable input, KeyFunc/**/ keyFunc) { + dynamic/*=T*/ maxValue; + dynamic maxKey; + for (dynamic/*=T*/ value in input) { + dynamic key = keyFunc(value); + if (maxKey == null || key > maxKey) { + maxValue = value; + maxKey = key; + } + } + return maxValue; +} diff --git a/packages/flutter/lib/src/material/arc.dart b/packages/flutter/lib/src/material/arc.dart index 02c865b6cb2..3573d466135 100644 --- a/packages/flutter/lib/src/material/arc.dart +++ b/packages/flutter/lib/src/material/arc.dart @@ -5,6 +5,7 @@ import 'dart:math' as math; import 'dart:ui' show hashValues, lerpDouble; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; @@ -165,14 +166,7 @@ class MaterialRectArcTween extends RectTween { @required Rect end }) : super(begin: begin, end: end) { final Offset centersVector = end.center - begin.center; - double maxSupport = 0.0; - for (_Diagonal diagonal in _allDiagonals) { - final double support = _diagonalSupport(centersVector, diagonal); - if (support > maxSupport) { - _diagonal = diagonal; - maxSupport = support; - } - } + _diagonal = maxBy(_allDiagonals, (_Diagonal d) => _diagonalSupport(centersVector, d)); _beginArc = new MaterialPointArcTween( begin: _cornerFor(begin, _diagonal.beginId), end: _cornerFor(end, _diagonal.beginId)