mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
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:
parent
e131243b00
commit
a51141a36d
@ -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 =
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user