Skip to content

Commit 673ebbe

Browse files
authored
Fix TabController disposal race during iOS scene-restore (#1218)
1 parent e7b3c6f commit 673ebbe

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

app/lib/screens/home_screen.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@ class _HomeScreenState extends ConsumerState<HomeScreen>
4343
bool timeoutExpiredInBackground = true;
4444
bool pinCheckOpen = false;
4545
late AppLinks _appLinks;
46+
TabController? _ownedTabController;
4647

4748
@override
4849
void dispose() {
4950
_sub?.cancel();
50-
globals.tabController.removeListener(_handleTabSelection);
51-
globals.tabController.dispose();
51+
_ownedTabController?.removeListener(_handleTabSelection);
52+
if (identical(globals.tabController, _ownedTabController)) {
53+
_ownedTabController?.dispose();
54+
}
5255
super.dispose();
5356
}
5457

@@ -118,8 +121,9 @@ class _HomeScreenState extends ConsumerState<HomeScreen>
118121
super.initState();
119122
initUniLinks();
120123

121-
globals.tabController = TabController(
124+
_ownedTabController = TabController(
122125
initialIndex: 0, length: Globals().router.routes.length, vsync: this);
126+
globals.tabController = _ownedTabController!;
123127
globals.tabController.addListener(_handleTabSelection);
124128

125129
Events().onEvent(GoHomeEvent().runtimeType, close);
@@ -192,7 +196,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen>
192196
if (initialLink != null) {
193197
Events().emit(UniLinkEvent(Uri.parse(initialLink!), context));
194198
}
195-
199+
196200
_appLinks = AppLinks();
197201
_sub = _appLinks.uriLinkStream.listen((Uri? uri) {
198202
if (!mounted || uri == null) {

0 commit comments

Comments
 (0)