import 'package:flutter/animation.dart'; abstract class MergeTweenable { T get empty; Tween tweenTo(T other); bool operator <(T other); } class MergeTween> extends Tween> { MergeTween(List begin, List end) : super(begin: begin, end: end) { final bMax = begin.length; final eMax = end.length; var b = 0; var e = 0; while (b + e < bMax + eMax) { if (b < bMax && (e == eMax || begin[b] < end[e])) { _tweens.add(begin[b].tweenTo(begin[b].empty)); b++; } else if (e < eMax && (b == bMax || end[e] < begin[b])) { _tweens.add(end[e].empty.tweenTo(end[e])); e++; } else { _tweens.add(begin[b].tweenTo(end[e])); b++; e++; } } } final _tweens = >[]; @override List lerp(double t) => List.generate( _tweens.length, (i) => _tweens[i].lerp(t), ); }