diff --git a/packages/flutter/lib/src/material/mergeable_material.dart b/packages/flutter/lib/src/material/mergeable_material.dart index da1af3b5a8..1ff2982d79 100644 --- a/packages/flutter/lib/src/material/mergeable_material.dart +++ b/packages/flutter/lib/src/material/mergeable_material.dart @@ -470,7 +470,12 @@ class _MergeableMaterialState extends State with TickerProvid _removeChild(j); } while (i < newChildren.length) { - _insertChild(j, newChildren[i]); + final MergeableMaterialItem newChild = newChildren[i]; + _insertChild(j, newChild); + + if (newChild is MaterialGap) { + _animationTuples[newChild.key]!.controller.forward(); + } i += 1; j += 1; diff --git a/packages/flutter/test/material/mergeable_material_test.dart b/packages/flutter/test/material/mergeable_material_test.dart index 2e37bff2a2..08b3fc735d 100644 --- a/packages/flutter/test/material/mergeable_material_test.dart +++ b/packages/flutter/test/material/mergeable_material_test.dart @@ -1088,6 +1088,75 @@ void main() { matches(getBorderRadius(tester, 1), RadiusType.Round, RadiusType.Round); }); + testWidgets('MergeableMaterial insert and separate slice', (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: MergeableMaterial( + children: [ + MaterialSlice( + key: ValueKey('A'), + child: SizedBox( + width: 100.0, + height: 100.0, + ), + ), + ], + ), + ), + ), + ), + ); + + final RenderBox box = tester.renderObject(find.byType(MergeableMaterial)); + expect(box.size.height, equals(100)); + + matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round); + + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: MergeableMaterial( + children: [ + MaterialSlice( + key: ValueKey('A'), + child: SizedBox( + width: 100.0, + height: 100.0, + ), + ), + MaterialGap( + key: ValueKey('x'), + ), + MaterialSlice( + key: ValueKey('B'), + child: SizedBox( + width: 100.0, + height: 100.0, + ), + ), + ], + ), + ), + ), + ), + ); + + await tester.pump(const Duration(milliseconds: 100)); + expect(box.size.height, lessThan(216)); + + matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Shifting); + matches(getBorderRadius(tester, 1), RadiusType.Shifting, RadiusType.Round); + + await tester.pump(const Duration(milliseconds: 100)); + expect(box.size.height, equals(216)); + + matches(getBorderRadius(tester, 0), RadiusType.Round, RadiusType.Round); + matches(getBorderRadius(tester, 1), RadiusType.Round, RadiusType.Round); + }); + bool isDivider(BoxDecoration decoration, bool top, bool bottom) { const BorderSide side = BorderSide(color: Color(0x1F000000), width: 0.5);