Animate TextStyle.fontVariations (#138881)
Fixes https://github.com/flutter/flutter/issues/105120
I also exposed the relevant dart:ui types which had the effect of removing a large number of dart:ui imports from examples.
diff --git a/examples/api/lib/ui/text/font_feature.0.dart b/examples/api/lib/ui/text/font_feature.0.dart
index 5ef2f86..cc657cf 100644
--- a/examples/api/lib/ui/text/font_feature.0.dart
+++ b/examples/api/lib/ui/text/font_feature.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/material.dart';
/// Flutter code sample for [FontFeature].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_alternative.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_alternative.0.dart
index 5207173..95491a1 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_alternative.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_alternative.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.alternative].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_alternative_fractions.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_alternative_fractions.0.dart
index 2ca48e2..62e3659 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_alternative_fractions.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_alternative_fractions.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.alternativeFractions].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_case_sensitive_forms.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_case_sensitive_forms.0.dart
index 52df814..8ad7877 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_case_sensitive_forms.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_case_sensitive_forms.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.caseSensitiveForms].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_character_variant.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_character_variant.0.dart
index f746d50..0acf162 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_character_variant.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_character_variant.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.characterVariant].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_contextual_alternates.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_contextual_alternates.0.dart
index cd3654b..f71d8f3 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_contextual_alternates.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_contextual_alternates.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.contextualAlternates].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_denominator.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_denominator.0.dart
index 9097b25..e62a9dd 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_denominator.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_denominator.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.denominator].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_fractions.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_fractions.0.dart
index 01433db..c77c679 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_fractions.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_fractions.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.fractions].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_historical_forms.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_historical_forms.0.dart
index a821dcc..3de92ab 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_historical_forms.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_historical_forms.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.historicalForms].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart
index 039dbca..9418c31 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.historicalLigatures].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_lining_figures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_lining_figures.0.dart
index 8851510..3a82a31 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_lining_figures.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_lining_figures.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.liningFigures].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_notational_forms.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_notational_forms.0.dart
index 562e5e0..42e1354 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_notational_forms.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_notational_forms.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.notationalForms].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_numerators.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_numerators.0.dart
index 213bf8e..c16efd0 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_numerators.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_numerators.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.numerators].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_oldstyle_figures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_oldstyle_figures.0.dart
index 7de9126..9649d0f 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_oldstyle_figures.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_oldstyle_figures.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.oldstyleFigures].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_ordinal_forms.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_ordinal_forms.0.dart
index 20b6720..dbec73a 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_ordinal_forms.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_ordinal_forms.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.ordinalForms].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_proportional_figures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_proportional_figures.0.dart
index aaa15f5..283f747 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_proportional_figures.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_proportional_figures.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.proportionalFigures].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_scientific_inferiors.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_scientific_inferiors.0.dart
index b17115d..a9f63f1 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_scientific_inferiors.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_scientific_inferiors.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.scientificInferiors].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_slashed_zero.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_slashed_zero.0.dart
index 105a1f4..44bcbfa 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_slashed_zero.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_slashed_zero.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.slashedZero].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_alternates.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_alternates.0.dart
index b9f5e67..021320b 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_alternates.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_alternates.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.stylisticAlternates].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.0.dart
index 812c559..23699b9 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.stylisticSet].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.1.dart b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.1.dart
index a419bf3..b4c64e4 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.1.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_stylistic_set.1.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.stylisticSet].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_subscripts.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_subscripts.0.dart
index ab1b612..0151b88 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_subscripts.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_subscripts.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.subscripts].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_superscripts.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_superscripts.0.dart
index 490955d..8eef914 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_superscripts.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_superscripts.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.superscripts].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_swash.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_swash.0.dart
index 986981a..d47c031 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_swash.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_swash.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [FontFeature.FontFeature.swash].
diff --git a/examples/api/lib/ui/text/font_feature.font_feature_tabular_figures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_tabular_figures.0.dart
index c2055ca..db7cc09 100644
--- a/examples/api/lib/ui/text/font_feature.font_feature_tabular_figures.0.dart
+++ b/examples/api/lib/ui/text/font_feature.font_feature_tabular_figures.0.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/widgets.dart';
/// Flutter code sample for [dart]:ui FontFeature.FontFeature.tabularFigures.
diff --git a/examples/api/test/ui/text/font_feature.0_test.dart b/examples/api/test/ui/text/font_feature.0_test.dart
index 45bccfe..519bf18 100644
--- a/examples/api/test/ui/text/font_feature.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_alternative.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_alternative.0_test.dart
index 0d4a9fb..7560913 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_alternative.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_alternative.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_alternative.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_alternative_fractions.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_alternative_fractions.0_test.dart
index cc949af..c8229ee 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_alternative_fractions.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_alternative_fractions.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_alternative_fractions.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_case_sensitive_forms.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_case_sensitive_forms.0_test.dart
index 23a56ed..fe10c44 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_case_sensitive_forms.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_case_sensitive_forms.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_case_sensitive_forms.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_character_variant.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_character_variant.0_test.dart
index bd5259d..3e1bb6a 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_character_variant.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_character_variant.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_character_variant.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_contextual_alternates.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_contextual_alternates.0_test.dart
index 1981ff6..59ae39e 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_contextual_alternates.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_contextual_alternates.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_contextual_alternates.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_denominator.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_denominator.0_test.dart
index ec43ecf..d2995bd 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_denominator.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_denominator.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_denominator.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_fractions.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_fractions.0_test.dart
index 05bc5b9..1592373 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_fractions.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_fractions.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_fractions.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_historical_forms.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_historical_forms.0_test.dart
index 240ab34..e945151 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_historical_forms.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_historical_forms.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_historical_forms.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_historical_ligatures.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_historical_ligatures.0_test.dart
index 7133684..babd68f 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_historical_ligatures.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_historical_ligatures.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_historical_ligatures.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_lining_figures.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_lining_figures.0_test.dart
index 80672aa..94e7c6f 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_lining_figures.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_lining_figures.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_lining_figures.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_notational_forms.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_notational_forms.0_test.dart
index 18b5e20..124d3aa 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_notational_forms.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_notational_forms.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_notational_forms.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_numerators.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_numerators.0_test.dart
index 5cd59a1..a9dbd19 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_numerators.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_numerators.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_numerators.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_oldstyle_figures.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_oldstyle_figures.0_test.dart
index 5d0fcf8..9210c0b 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_oldstyle_figures.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_oldstyle_figures.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_oldstyle_figures.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_ordinal_forms.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_ordinal_forms.0_test.dart
index c5ae315..c26f8c2 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_ordinal_forms.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_ordinal_forms.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_ordinal_forms.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_proportional_figures.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_proportional_figures.0_test.dart
index 7fe8c04..af1d880 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_proportional_figures.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_proportional_figures.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_proportional_figures.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_scientific_inferiors.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_scientific_inferiors.0_test.dart
index cdfce67..c1f7aa8 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_scientific_inferiors.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_scientific_inferiors.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_scientific_inferiors.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_slashed_zero.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_slashed_zero.0_test.dart
index 9481c57..bf9f3b4 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_slashed_zero.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_slashed_zero.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_slashed_zero.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_stylistic_alternates.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_stylistic_alternates.0_test.dart
index 638a01e..8db703c 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_stylistic_alternates.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_stylistic_alternates.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_stylistic_alternates.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.0_test.dart
index 023e9eb..1be7b35 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_stylistic_set.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.1_test.dart b/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.1_test.dart
index 4e6ce35..16fb436 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.1_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_stylistic_set.1_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_stylistic_set.1.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_subscripts.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_subscripts.0_test.dart
index 17d2b27..9cab008 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_subscripts.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_subscripts.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_subscripts.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_superscripts.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_superscripts.0_test.dart
index f3a01ff..a940b93 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_superscripts.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_superscripts.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_superscripts.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_swash.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_swash.0_test.dart
index 4fcaf43..ca5a68d 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_swash.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_swash.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_swash.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/examples/api/test/ui/text/font_feature.font_feature_tabular_figures.0_test.dart b/examples/api/test/ui/text/font_feature.font_feature_tabular_figures.0_test.dart
index b2a3d50..9cfef91 100644
--- a/examples/api/test/ui/text/font_feature.font_feature_tabular_figures.0_test.dart
+++ b/examples/api/test/ui/text/font_feature.font_feature_tabular_figures.0_test.dart
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/ui/text/font_feature.font_feature_tabular_figures.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
diff --git a/packages/flutter/lib/src/painting/basic_types.dart b/packages/flutter/lib/src/painting/basic_types.dart
index 6107e10..f07db13 100644
--- a/packages/flutter/lib/src/painting/basic_types.dart
+++ b/packages/flutter/lib/src/painting/basic_types.dart
@@ -12,7 +12,9 @@
Color,
ColorFilter,
FilterQuality,
+ FontFeature,
FontStyle,
+ FontVariation,
FontWeight,
ImageShader,
Locale,
@@ -28,6 +30,7 @@
Radius,
Rect,
Shader,
+ Shadow,
Size,
StrokeCap,
StrokeJoin,
@@ -38,6 +41,8 @@
TextDecoration,
TextDecorationStyle,
TextDirection,
+ TextHeightBehavior,
+ TextLeadingDistribution,
TextPosition,
TileMode,
VertexMode,
diff --git a/packages/flutter/lib/src/painting/strut_style.dart b/packages/flutter/lib/src/painting/strut_style.dart
index 432a835..4f80fbe 100644
--- a/packages/flutter/lib/src/painting/strut_style.dart
+++ b/packages/flutter/lib/src/painting/strut_style.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui' show TextLeadingDistribution;
-
import 'package:flutter/foundation.dart';
import 'basic_types.dart';
diff --git a/packages/flutter/lib/src/painting/text_painter.dart b/packages/flutter/lib/src/painting/text_painter.dart
index 4991c32..e999215 100644
--- a/packages/flutter/lib/src/painting/text_painter.dart
+++ b/packages/flutter/lib/src/painting/text_painter.dart
@@ -12,7 +12,6 @@
ParagraphConstraints,
ParagraphStyle,
PlaceholderAlignment,
- TextHeightBehavior,
TextStyle;
import 'package:flutter/foundation.dart';
@@ -488,7 +487,7 @@
Locale? locale,
StrutStyle? strutStyle,
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
- ui.TextHeightBehavior? textHeightBehavior,
+ TextHeightBehavior? textHeightBehavior,
}) : assert(text == null || text.debugAssertIsValid()),
assert(maxLines == null || maxLines > 0),
assert(textScaleFactor == 1.0 || identical(textScaler, TextScaler.noScaling), 'Use textScaler instead.'),
@@ -537,7 +536,7 @@
Locale? locale,
StrutStyle? strutStyle,
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
- ui.TextHeightBehavior? textHeightBehavior,
+ TextHeightBehavior? textHeightBehavior,
double minWidth = 0.0,
double maxWidth = double.infinity,
}) {
@@ -589,7 +588,7 @@
Locale? locale,
StrutStyle? strutStyle,
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
- ui.TextHeightBehavior? textHeightBehavior,
+ TextHeightBehavior? textHeightBehavior,
double minWidth = 0.0,
double maxWidth = double.infinity,
}) {
@@ -894,9 +893,9 @@
}
/// {@macro dart.ui.textHeightBehavior}
- ui.TextHeightBehavior? get textHeightBehavior => _textHeightBehavior;
- ui.TextHeightBehavior? _textHeightBehavior;
- set textHeightBehavior(ui.TextHeightBehavior? value) {
+ TextHeightBehavior? get textHeightBehavior => _textHeightBehavior;
+ TextHeightBehavior? _textHeightBehavior;
+ set textHeightBehavior(TextHeightBehavior? value) {
if (_textHeightBehavior == value) {
return;
}
diff --git a/packages/flutter/lib/src/painting/text_style.dart b/packages/flutter/lib/src/painting/text_style.dart
index 6c2d583..625e102 100644
--- a/packages/flutter/lib/src/painting/text_style.dart
+++ b/packages/flutter/lib/src/painting/text_style.dart
@@ -2,14 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import 'dart:collection';
import 'dart:ui' as ui show
- FontFeature,
- FontVariation,
ParagraphStyle,
- Shadow,
StrutStyle,
- TextHeightBehavior,
- TextLeadingDistribution,
TextStyle,
lerpDouble;
@@ -680,7 +676,7 @@
///
/// Defaults to null, which defers to the paragraph's
/// `ParagraphStyle.textHeightBehavior`'s [leadingDistribution].
- final ui.TextLeadingDistribution? leadingDistribution;
+ final TextLeadingDistribution? leadingDistribution;
/// The locale used to select region-specific glyphs.
///
@@ -800,7 +796,7 @@
///
/// Shadows must be in the same order for [TextStyle] to be considered as
/// equivalent as order produces differing transparency.
- final List<ui.Shadow>? shadows;
+ final List<Shadow>? shadows;
/// A list of [FontFeature]s that affect how the font selects glyphs.
///
@@ -809,7 +805,13 @@
/// tabular numbers, or it might offer versions of the zero digit with
/// and without slashes. [FontFeature]s can be used to select which of
/// these variants will be used for rendering.
- final List<ui.FontFeature>? fontFeatures;
+ ///
+ /// Font features are not interpolated by [lerp].
+ ///
+ /// See also:
+ ///
+ /// * [fontVariations], for font features that have continuous parameters.
+ final List<FontFeature>? fontFeatures;
/// A list of [FontVariation]s that affect how a variable font is rendered.
///
@@ -823,10 +825,18 @@
/// ```dart
/// const TextStyle(
/// fontFamily: 'RobotoSlab',
- /// fontVariations: <ui.FontVariation>[ui.FontVariation('wght', 900.0)]
+ /// fontVariations: <FontVariation>[FontVariation('wght', 900.0)]
/// )
/// ```
- final List<ui.FontVariation>? fontVariations;
+ ///
+ /// Font variations can be interpolated via [lerp]. This is fastest when the
+ /// same font variation axes are specified, in the same order, in both
+ /// [TextStyle] objects. See [lerpFontVariations].
+ ///
+ /// See also:
+ ///
+ /// * [fontFeatures], for font variations that have discrete values.
+ final List<FontVariation>? fontVariations;
/// How visual text overflow should be handled.
final TextOverflow? overflow;
@@ -862,13 +872,13 @@
double? wordSpacing,
TextBaseline? textBaseline,
double? height,
- ui.TextLeadingDistribution? leadingDistribution,
+ TextLeadingDistribution? leadingDistribution,
Locale? locale,
Paint? foreground,
Paint? background,
- List<ui.Shadow>? shadows,
- List<ui.FontFeature>? fontFeatures,
- List<ui.FontVariation>? fontVariations,
+ List<Shadow>? shadows,
+ List<FontFeature>? fontFeatures,
+ List<FontVariation>? fontVariations,
TextDecoration? decoration,
Color? decorationColor,
TextDecorationStyle? decorationStyle,
@@ -967,11 +977,11 @@
double heightFactor = 1.0,
double heightDelta = 0.0,
TextBaseline? textBaseline,
- ui.TextLeadingDistribution? leadingDistribution,
+ TextLeadingDistribution? leadingDistribution,
Locale? locale,
- List<ui.Shadow>? shadows,
- List<ui.FontFeature>? fontFeatures,
- List<ui.FontVariation>? fontVariations,
+ List<Shadow>? shadows,
+ List<FontFeature>? fontFeatures,
+ List<FontVariation>? fontVariations,
String? package,
TextOverflow? overflow,
}) {
@@ -1136,7 +1146,7 @@
background: t < 0.5 ? null : b.background,
shadows: t < 0.5 ? null : b.shadows,
fontFeatures: t < 0.5 ? null : b.fontFeatures,
- fontVariations: t < 0.5 ? null : b.fontVariations,
+ fontVariations: lerpFontVariations(null, b.fontVariations, t),
decoration: t < 0.5 ? null : b.decoration,
decorationColor: Color.lerp(null, b.decorationColor, t),
decorationStyle: t < 0.5 ? null : b.decorationStyle,
@@ -1167,7 +1177,7 @@
background: t < 0.5 ? a.background : null,
shadows: t < 0.5 ? a.shadows : null,
fontFeatures: t < 0.5 ? a.fontFeatures : null,
- fontVariations: t < 0.5 ? a.fontVariations : null,
+ fontVariations: lerpFontVariations(a.fontVariations, null, t),
decoration: t < 0.5 ? a.decoration : null,
decorationColor: Color.lerp(a.decorationColor, null, t),
decorationStyle: t < 0.5 ? a.decorationStyle : null,
@@ -1267,7 +1277,7 @@
: null,
shadows: t < 0.5 ? a.shadows : b.shadows,
fontFeatures: t < 0.5 ? a.fontFeatures : b.fontFeatures,
- fontVariations: t < 0.5 ? a.fontVariations : b.fontVariations,
+ fontVariations: lerpFontVariations(a.fontVariations, b.fontVariations, t),
decoration: t < 0.5 ? a.decoration : b.decoration,
decorationColor: Color.lerp(a.decorationColor, b.decorationColor, t),
decorationStyle: t < 0.5 ? a.decorationStyle : b.decorationStyle,
@@ -1342,7 +1352,7 @@
TextScaler textScaler = TextScaler.noScaling,
String? ellipsis,
int? maxLines,
- ui.TextHeightBehavior? textHeightBehavior,
+ TextHeightBehavior? textHeightBehavior,
Locale? locale,
String? fontFamily,
double? fontSize,
@@ -1352,9 +1362,9 @@
StrutStyle? strutStyle,
}) {
assert(maxLines == null || maxLines > 0);
- final ui.TextLeadingDistribution? leadingDistribution = this.leadingDistribution;
- final ui.TextHeightBehavior? effectiveTextHeightBehavior = textHeightBehavior
- ?? (leadingDistribution == null ? null : ui.TextHeightBehavior(leadingDistribution: leadingDistribution));
+ final TextLeadingDistribution? leadingDistribution = this.leadingDistribution;
+ final TextHeightBehavior? effectiveTextHeightBehavior = textHeightBehavior
+ ?? (leadingDistribution == null ? null : TextHeightBehavior(leadingDistribution: leadingDistribution));
return ui.ParagraphStyle(
textAlign: textAlign,
@@ -1475,9 +1485,9 @@
overflow,
);
- final List<ui.Shadow>? shadows = this.shadows;
- final List<ui.FontFeature>? fontFeatures = this.fontFeatures;
- final List<ui.FontVariation>? fontVariations = this.fontVariations;
+ final List<Shadow>? shadows = this.shadows;
+ final List<FontFeature>? fontFeatures = this.fontFeatures;
+ final List<FontVariation>? fontVariations = this.fontVariations;
return Object.hash(
inherit,
color,
@@ -1537,7 +1547,7 @@
styles.add(DoubleProperty('${prefix}wordSpacing', wordSpacing, defaultValue: null));
styles.add(EnumProperty<TextBaseline>('${prefix}baseline', textBaseline, defaultValue: null));
styles.add(DoubleProperty('${prefix}height', height, unit: 'x', defaultValue: null));
- styles.add(EnumProperty<ui.TextLeadingDistribution>('${prefix}leadingDistribution', leadingDistribution, defaultValue: null));
+ styles.add(EnumProperty<TextLeadingDistribution>('${prefix}leadingDistribution', leadingDistribution, defaultValue: null));
styles.add(DiagnosticsProperty<Locale>('${prefix}locale', locale, defaultValue: null));
styles.add(DiagnosticsProperty<Paint>('${prefix}foreground', foreground, defaultValue: null));
styles.add(DiagnosticsProperty<Paint>('${prefix}background', background, defaultValue: null));
@@ -1578,3 +1588,95 @@
styles.add(EnumProperty<TextOverflow>('${prefix}overflow', overflow, defaultValue: null));
}
}
+
+/// Interpolate between two lists of [FontVariation] objects.
+///
+/// Variations are paired by axis, and interpolated using [FontVariation.lerp].
+///
+/// Entries that are only present in one list are animated using a step-function
+/// at t=0.5 that enables or disables the variation. This can be jarring and
+/// largely defeats the point of animating font variations. For best results,
+/// specify the same axes in both lists, and for best performance, specify them
+/// in the same order.
+///
+/// ## Performance details
+///
+/// This algorithm is O(N), but the constant factor varies based on the input,
+/// and that is probably more important (because typically N is going to be
+/// tiny, like 1 or 2; at the time of writing, there are only about five defined
+/// axes that fonts typically use!).
+///
+/// It is fastest when the lists contain the same axes ([FontVariation.axis]) in
+/// the same order. The result is again in the same order, and no attempt is
+/// made to detect or remove duplicates in this process. This is, by far, the
+/// recommended way to use this algorithm.
+///
+/// When the order of items in the two input lists vary, the constant factor
+/// increases substantially, as it involves creating two maps and a set,
+/// inserting every variation in both lists into the maps and the set, and then
+/// iterating over them to recreate the list.
+///
+/// In this case, the resulting order is arbitrary. Duplicates are dropped; in
+/// each list, the last [FontVariation] for any particular axis is the one used
+/// to compute the value for that axis. Values that only appear on one side are
+/// interpolated using [FontVariation.lerp] against a null value, and resulting
+/// null values are omitted from the resulting list.
+///
+/// When the lists begin with matching pairs of axes, the fast algorithm is used
+/// up to the point where the lists diverge, and the more expensive algorithm
+/// is used on the remaining entries.
+///
+/// See also:
+///
+/// * [TextStyle.lerp], which uses this function to handle
+/// [TextStyle.fontVariations].
+List<FontVariation>? lerpFontVariations(List<FontVariation>? a, List<FontVariation>? b, double t) {
+ if (t == 0.0) {
+ return a;
+ }
+ if (t == 1.0) {
+ return b;
+ }
+ if (a == null || a.isEmpty || b == null || b.isEmpty) {
+ // If one side is empty, that means anything on the other
+ // side will use the null-to-something lerp, which is to
+ // say, a step function at t=0.5.
+ return t < 0.5 ? a : b;
+ }
+ assert(a.isNotEmpty && b.isNotEmpty);
+ final List<FontVariation> result = <FontVariation>[];
+ // First, try the efficient O(N) solution in the event that
+ // the lists are compatible.
+ int index = 0;
+ final int minLength = a.length < b.length ? a.length : b.length;
+ for (; index < minLength; index += 1) {
+ if (a[index].axis != b[index].axis) {
+ // The lists aren't compatible.
+ break;
+ }
+ result.add(FontVariation.lerp(a[index], b[index], t)!);
+ }
+ final int maxLength = a.length > b.length ? a.length : b.length;
+ if (index < maxLength) {
+ // If we get here, we have found some case where we cannot
+ // use the efficient approach.
+ final Set<String> axes = HashSet<String>();
+ final Map<String, FontVariation> aVariations = HashMap<String, FontVariation>();
+ for (int indexA = index; indexA < a.length; indexA += 1) {
+ aVariations[a[indexA].axis] = a[indexA];
+ axes.add(a[indexA].axis);
+ }
+ final Map<String, FontVariation> bVariations = HashMap<String, FontVariation>();
+ for (int indexB = index; indexB < b.length; indexB += 1) {
+ bVariations[b[indexB].axis] = b[indexB];
+ axes.add(b[indexB].axis);
+ }
+ for (final String axis in axes) {
+ final FontVariation? variation = FontVariation.lerp(aVariations[axis], bVariations[axis], t);
+ if (variation != null) {
+ result.add(variation);
+ }
+ }
+ }
+ return result;
+}
diff --git a/packages/flutter/lib/src/widgets/icon.dart b/packages/flutter/lib/src/widgets/icon.dart
index dbd27cf..b6944fb 100644
--- a/packages/flutter/lib/src/widgets/icon.dart
+++ b/packages/flutter/lib/src/widgets/icon.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
diff --git a/packages/flutter/test/painting/text_style_test.dart b/packages/flutter/test/painting/text_style_test.dart
index ca2330e..ffad8a3 100644
--- a/packages/flutter/test/painting/text_style_test.dart
+++ b/packages/flutter/test/painting/text_style_test.dart
@@ -595,4 +595,63 @@
expect(TextStyle.lerp(fromStyle, toStyle, 1), toStyle);
});
+ test('lerpFontVariations', () {
+ // nil cases
+ expect(lerpFontVariations(const <FontVariation>[], const <FontVariation>[], 0.0), const <FontVariation>[]);
+ expect(lerpFontVariations(const <FontVariation>[], const <FontVariation>[], 0.5), const <FontVariation>[]);
+ expect(lerpFontVariations(const <FontVariation>[], const <FontVariation>[], 1.0), const <FontVariation>[]);
+ expect(lerpFontVariations(null, const <FontVariation>[], 0.0), null);
+ expect(lerpFontVariations(const <FontVariation>[], null, 0.0), const <FontVariation>[]);
+ expect(lerpFontVariations(null, null, 0.0), null);
+ expect(lerpFontVariations(null, const <FontVariation>[], 0.5), const <FontVariation>[]);
+ expect(lerpFontVariations(const <FontVariation>[], null, 0.5), null);
+ expect(lerpFontVariations(null, null, 0.5), null);
+ expect(lerpFontVariations(null, const <FontVariation>[], 1.0), const <FontVariation>[]);
+ expect(lerpFontVariations(const <FontVariation>[], null, 1.0), null);
+ expect(lerpFontVariations(null, null, 1.0), null);
+
+ const FontVariation w100 = FontVariation.weight(100.0);
+ const FontVariation w120 = FontVariation.weight(120.0);
+ const FontVariation w150 = FontVariation.weight(150.0);
+ const FontVariation w200 = FontVariation.weight(200.0);
+ const FontVariation w300 = FontVariation.weight(300.0);
+ const FontVariation w1000 = FontVariation.weight(1000.0);
+
+ // one axis
+ expect(lerpFontVariations(const <FontVariation>[w100], const <FontVariation>[w200], 0.0), const <FontVariation>[w100]);
+ expect(lerpFontVariations(const <FontVariation>[w100], const <FontVariation>[w200], 0.2), const <FontVariation>[w120]);
+ expect(lerpFontVariations(const <FontVariation>[w100], const <FontVariation>[w200], 0.5), const <FontVariation>[w150]);
+ expect(lerpFontVariations(const <FontVariation>[w100], const <FontVariation>[w200], 2.0), const <FontVariation>[w300]);
+
+ // weird one axis cases
+ expect(lerpFontVariations(const <FontVariation>[w100, w1000], const <FontVariation>[w300], 0.0), const <FontVariation>[w100, w1000]);
+ expect(lerpFontVariations(const <FontVariation>[w100, w1000], const <FontVariation>[w300], 0.5), const <FontVariation>[w200]);
+ expect(lerpFontVariations(const <FontVariation>[w100, w1000], const <FontVariation>[w300], 1.0), const <FontVariation>[w300]);
+ expect(lerpFontVariations(const <FontVariation>[w100, w1000], const <FontVariation>[], 0.5), const <FontVariation>[]);
+
+ const FontVariation sn80 = FontVariation.slant(-80.0);
+ const FontVariation sn40 = FontVariation.slant(-40.0);
+ const FontVariation s0 = FontVariation.slant(0.0);
+ const FontVariation sp40 = FontVariation.slant(40.0);
+ const FontVariation sp80 = FontVariation.slant(80.0);
+
+ // two axis matched order
+ expect(lerpFontVariations(const <FontVariation>[w100, sn80], const <FontVariation>[w300, sp80], 0.5), const <FontVariation>[w200, s0]);
+
+ // two axis unmatched order
+ expect(lerpFontVariations(const <FontVariation>[sn80, w100], const <FontVariation>[w300, sp80], 0.0), const <FontVariation>[sn80, w100]);
+ expect(lerpFontVariations(const <FontVariation>[sn80, w100], const <FontVariation>[w300, sp80], 0.5), unorderedMatches(const <FontVariation>[s0, w200]));
+ expect(lerpFontVariations(const <FontVariation>[sn80, w100], const <FontVariation>[w300, sp80], 1.0), const <FontVariation>[w300, sp80]);
+
+ // two axis with duplicates
+ expect(lerpFontVariations(const <FontVariation>[sn80, w100, sp80], const <FontVariation>[w300, sp80], 0.5), unorderedMatches(const <FontVariation>[sp80, w200]));
+
+ // mixed axis counts
+ expect(lerpFontVariations(const <FontVariation>[sn80, w100], const <FontVariation>[w300], 0.5), const <FontVariation>[w200]);
+ expect(lerpFontVariations(const <FontVariation>[sn80], const <FontVariation>[w300], 0.0), const <FontVariation>[sn80]);
+ expect(lerpFontVariations(const <FontVariation>[sn80], const <FontVariation>[w300], 0.1), const <FontVariation>[sn80]);
+ expect(lerpFontVariations(const <FontVariation>[sn80], const <FontVariation>[w300], 0.9), const <FontVariation>[w300]);
+ expect(lerpFontVariations(const <FontVariation>[sn80], const <FontVariation>[w300], 1.0), const <FontVariation>[w300]);
+ expect(lerpFontVariations(const <FontVariation>[sn40, s0, w100], const <FontVariation>[sp40, w300, sp80], 0.5), anyOf(equals(const <FontVariation>[s0, w200, sp40]), equals(const <FontVariation>[s0, sp40, w200])));
+ });
}
diff --git a/packages/flutter/test/widgets/icon_test.dart b/packages/flutter/test/widgets/icon_test.dart
index 8a7eed7..d9e1409 100644
--- a/packages/flutter/test/widgets/icon_test.dart
+++ b/packages/flutter/test/widgets/icon_test.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:ui';
-
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';