Update CupertinoSliverNavigationBar.middle (#173868)

Fixes [CupertinoSliverNavigationBar middle widget does not update/react
when its value
changes](https://github.com/flutter/flutter/issues/173855)
This commit is contained in:
Victor Sanni 2025-08-19 15:31:17 -07:00 committed by GitHub
parent e131243b00
commit a51141a36d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 1 deletions

View File

@ -1202,11 +1202,19 @@ class _CupertinoSliverNavigationBarState extends State<CupertinoSliverNavigation
_searchAnimation = CurvedAnimation(parent: _animationController, curve: _kNavBarSearchCurve);
}
@override
void didUpdateWidget(CupertinoSliverNavigationBar oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.middle != oldWidget.middle) {
_updateEffectiveMiddle();
}
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
isPortrait = MediaQuery.orientationOf(context) == Orientation.portrait;
effectiveMiddle = widget.middle ?? (isPortrait ? null : widget.largeTitle);
_updateEffectiveMiddle();
_computeScaledHeights();
_setupSearchableAnimation();
_scrollableState?.position.isScrollingNotifier.removeListener(_handleScrollChange);
@ -1234,6 +1242,10 @@ class _CupertinoSliverNavigationBarState extends State<CupertinoSliverNavigation
return 0.0;
}
void _updateEffectiveMiddle() {
effectiveMiddle = widget.middle ?? (isPortrait ? null : widget.largeTitle);
}
void _computeScaledHeights() {
final TextScaler textScaler = MediaQuery.textScalerOf(context);
scaledSearchFieldHeight =

View File

@ -3131,6 +3131,42 @@ void main() {
expect(count, 2);
},
);
testWidgets('Sliver nav bar middle can be updated', (WidgetTester tester) async {
setWindowToPortrait(tester);
String middle = 'First';
late StateSetter setState;
await tester.pumpWidget(
CupertinoApp(
home: StatefulBuilder(
builder: (BuildContext context, StateSetter stateSetter) {
setState = stateSetter;
return CustomScrollView(
slivers: <Widget>[
CupertinoSliverNavigationBar(
largeTitle: const Text('Large title'),
middle: Text(middle),
),
const SliverFillRemaining(child: SizedBox(height: 1000.0)),
],
);
},
),
),
);
expect(find.text('First'), findsOneWidget);
expect(find.text('Second'), findsNothing);
setState(() {
middle = 'Second';
});
await tester.pump();
expect(find.text('First'), findsNothing);
expect(find.text('Second'), findsOneWidget);
});
}
class _ExpectStyles extends StatelessWidget {