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)