Fix for non-zero initial tab index not sizing children correctly and device orientation change support

This commit fixes two issues:
 - When the tabController.index was initial set to something > 0, the height for the children was not being calculated correctly.
 - When changing the device orientation (portrait/landscape) the height was not being updated.
This commit is contained in:
mzelldev 2024-02-15 09:30:18 -08:00
parent adfe89918f
commit c9d31a2b79
2 changed files with 16 additions and 14 deletions

View File

@ -18,14 +18,9 @@ class SizeDetectorWidget extends StatefulWidget {
class _SizeDetectorWidgetState extends State<SizeDetectorWidget> { class _SizeDetectorWidgetState extends State<SizeDetectorWidget> {
Size? _oldSize; Size? _oldSize;
@override
void initState() {
super.initState();
SchedulerBinding.instance?.addPostFrameCallback((_) => _detectSize());
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SchedulerBinding.instance?.addPostFrameCallback((_) => _detectSize());
return widget.child; return widget.child;
} }

View File

@ -21,8 +21,7 @@ class SizedPageView extends StatefulWidget {
_SizedPageViewState createState() => _SizedPageViewState(); _SizedPageViewState createState() => _SizedPageViewState();
} }
class _SizedPageViewState extends State<SizedPageView> class _SizedPageViewState extends State<SizedPageView> with TickerProviderStateMixin {
with TickerProviderStateMixin {
late List<double> _heights; late List<double> _heights;
int _currentIndex = 0; int _currentIndex = 0;
@ -32,14 +31,13 @@ class _SizedPageViewState extends State<SizedPageView>
void initState() { void initState() {
super.initState(); super.initState();
_heights = List.generate(widget.children.length, (index) => 0.0); _heights = List.generate(widget.children.length, (index) => 0.0);
final int initialIndex = widget.pageController.initialPage;
_setCurrentIndex(initialIndex);
widget.pageController.addListener(() { widget.pageController.addListener(() {
final _newIndex = widget.pageController.page?.round(); final int? newIndex = widget.pageController.page?.round();
if (_currentIndex != _newIndex) { if (newIndex != null) {
if (!mounted) { _setCurrentIndex(newIndex);
return;
}
setState(() => _currentIndex = _newIndex!);
} }
}); });
} }
@ -79,4 +77,13 @@ class _SizedPageViewState extends State<SizedPageView>
widget.pageController.dispose(); widget.pageController.dispose();
super.dispose(); super.dispose();
} }
void _setCurrentIndex(int newIndex) {
if (_currentIndex != newIndex) {
if (!mounted) {
return;
}
setState(() => _currentIndex = newIndex);
}
}
} }