Skip to content

Commit

Permalink
Revert "_DefaultTabControllerState should dispose all created TabCont…
Browse files Browse the repository at this point in the history
…oller instances. (#136608)" (#144579)

This reverts commit 9fa9fd3.

Fixes flutter/flutter#144087.
Fixes flutter/flutter#138588.

This crash has been reported previously from a customer in google3 in flutter/flutter#138588, but we weren't able to track it down. Thankfully, a repro was now provided in flutter/flutter#144087 (comment) which traced the crash down to a change made in #136608. This PR reverts that change to fix that crash for now. I will post a new PR shortly that will add a test to cover the use case that caused the crash with #136608 to make sure we don't re-introduce the crash in the future.
  • Loading branch information
goderbauer authored Mar 5, 2024
1 parent 3b5a2ec commit d93f24a
Showing 1 changed file with 6 additions and 19 deletions.
25 changes: 6 additions & 19 deletions packages/flutter/lib/src/material/tab_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,8 @@ class TabController extends ChangeNotifier {
}) : _index = index,
_previousIndex = previousIndex,
_animationController = animationController,
_animationDuration = animationDuration {
if (kFlutterMemoryAllocationsEnabled) {
ChangeNotifier.maybeDispatchObjectCreation(this);
}
}
_animationDuration = animationDuration;


/// Creates a new [TabController] with `index`, `previousIndex`, `length`, and
/// `animationDuration` if they are non-null.
Expand All @@ -145,10 +142,7 @@ class TabController extends ChangeNotifier {
///
/// When [DefaultTabController.length] is updated, this method is called to
/// create a new [TabController] without creating a new [AnimationController].
///
/// This instance of [TabController] will be disposed and must not be used
/// anymore.
TabController _copyWithAndDispose({
TabController _copyWith({
required int? index,
required int? length,
required int? previousIndex,
Expand All @@ -157,20 +151,13 @@ class TabController extends ChangeNotifier {
if (index != null) {
_animationController!.value = index.toDouble();
}
final TabController newController = TabController._(
return TabController._(
index: index ?? _index,
length: length ?? this.length,
animationController: _animationController,
previousIndex: previousIndex ?? _previousIndex,
animationDuration: animationDuration ?? _animationDuration,
);

// Nulling _animationController to not dispose it. It will be disposed by
// the newly created instance of the TabController.
_animationController = null;
dispose();

return newController;
}

/// An animation whose value represents the current position of the [TabBar]'s
Expand Down Expand Up @@ -498,7 +485,7 @@ class _DefaultTabControllerState extends State<DefaultTabController> with Single
newIndex = math.max(0, widget.length - 1);
previousIndex = _controller.index;
}
_controller = _controller._copyWithAndDispose(
_controller = _controller._copyWith(
length: widget.length,
animationDuration: widget.animationDuration,
index: newIndex,
Expand All @@ -507,7 +494,7 @@ class _DefaultTabControllerState extends State<DefaultTabController> with Single
}

if (oldWidget.animationDuration != widget.animationDuration) {
_controller = _controller._copyWithAndDispose(
_controller = _controller._copyWith(
length: widget.length,
animationDuration: widget.animationDuration,
index: _controller.index,
Expand Down

0 comments on commit d93f24a

Please sign in to comment.