当我尝试在颤动中从一个屏幕导航到另一个屏幕时,我收到一个异常,指出我要更改的 ScreenState 不会调用super.dispose()其dispose方法。然而,重写的dispose方法显然调用了super.dispose().
附件是相关的类和日志。任何帮助将不胜感激。
\n\n班级:
\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:kickit/screens/feed_screen.dart';\nimport 'package:kickit/screens/profile_screen.dart';\nimport 'package:kickit/screens/talk_screen.dart';\nimport 'package:kickit/utils/values/internal_strings.dart';\nimport 'package:kickit/utils/values/strings.dart';\nimport 'package:kickit/utils/values/values.dart';\n\n/// Main screen that contains three screens within for displaying information.\n/// Contains a:\n/// - [TalkScreen]\n/// - [FeedScreen]\n/// - [ProfileScreen]\nclass MainScreen extends StatefulWidget {\n @override\n State<StatefulWidget> createState() {\n return new _MainScreenState();\n }\n}\n\n/// Manages the state of [MainScreen].\nclass _MainScreenState extends State<MainScreen> with ChangeNotifier {\n // A PageController to manage which screen is currently shown.\n PageController _pageController;\n\n // The current page that is in focus.\n // - 0 => ConversationScreen\n // - 1 => FeedScreen\n // - 2 => ProfileScreen\n int _page = 1;\n\n /// Initializes this [MainScreen], setting the initial screen to the\n /// [FeedScreen] due to [_page] starting at 1.\n @override\n void initState() {\n super.initState();\n _pageController = new PageController(\n initialPage: _page,\n );\n }\n\n @override\n Widget build(BuildContext context) {\n return new Scaffold(\n // key: new ValueKey(InternalStrings.mainScaffoldKey),\n appBar: _appBar(),\n body: _mainScreens(),\n bottomNavigationBar: _bottomBar(),\n );\n }\n\n /// Gets an [AppBar] that will be shown across all of the screens controlled\n /// by this [MainScreen]\n AppBar _appBar() {\n return new AppBar(\n // key: new ValueKey(InternalStrings.mainAppBarKey),\n centerTitle: true,\n title: new Text(\n Strings.title,\n style: Theme.of(context).textTheme.title,\n ),\n actions: <Widget>[\n new IconButton(\n key: new ValueKey(InternalStrings.mainSettingsButtonKey),\n icon: new Icon(Icons.settings),\n onPressed: () => Navigator\n .of(context)\n .pushReplacementNamed(InternalStrings.mainScreenRoute),\n ),\n ],\n );\n }\n\n /// Gets a [PageView] storing the screens controlled by this [MainScreen].\n PageView _mainScreens() {\n return new PageView(\n // key: new ValueKey(InternalStrings.mainPageViewKey),\n controller: _pageController,\n onPageChanged: _onPageChanged,\n children: <Widget>[\n new Container(\n child: new TalkScreen(),\n ),\n new Container(\n child: new FeedScreen(),\n ),\n new Container(\n child: new ProfileScreen(),\n ),\n ],\n );\n }\n\n /// Gets a [BottomNavigationBar] that will be shown across all of the screens\n /// controlled by this [MainScreen]\n BottomNavigationBar _bottomBar() {\n return new BottomNavigationBar(\n // key: new ValueKey(InternalStrings.mainBottomBarKey),\n items: [\n new BottomNavigationBarItem(\n icon: new Icon(Icons.people),\n title: new Text(Strings.mainBottomBarTalk),\n ),\n new BottomNavigationBarItem(\n icon: new Icon(Icons.list),\n title: new Text(Strings.mainBottomBarFeed),\n ),\n new BottomNavigationBarItem(\n icon: new Icon(Icons.person),\n title: new Text(Strings.mainBottomBarProfile),\n ),\n ],\n onTap: _onNavigationTap,\n currentIndex: _page,\n );\n }\n\n /// Handles a tap on the bottom navigation bar.\n void _onNavigationTap(int page) {\n _pageController.animateToPage(\n page,\n duration: Values.animationShort,\n curve: Curves.ease,\n );\n }\n\n /// Handles a page change and updates the bottom bar.\n void _onPageChanged(int page) {\n this._pageController.notifyListeners();\n setState(() {\n this._page = page;\n });\n }\n\n /// Dispose of the [PageController] when disposed.\n @override\n void dispose() {\n super.dispose();\n _pageController.dispose();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n日志:
\n\nI/flutter (18130): \xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1 EXCEPTION CAUGHT BY WIDGETS LIBRARY \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nI/flutter (18130): The following assertion was thrown while finalizing the widget tree:\nI/flutter (18130): MainScreenState.dispose failed to call super.dispose.\nI/flutter (18130): dispose() implementations must always call their superclass dispose() method, to ensure that all the\nI/flutter (18130): resources used by the widget are fully released.\nI/flutter (18130): \nI/flutter (18130): When the exception was thrown, this was the stack:\nI/flutter (18130): #0 StatefulElement.unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:3771)\nI/flutter (18130): #1 StatefulElement.unmount (package:flutter/src/widgets/framework.dart:3776)\nI/flutter (18130): #2 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1670)\nI/flutter (18130): #3 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #4 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #5 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #6 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #7 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #8 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #9 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #10 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #11 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #12 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #13 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #14 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #15 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #16 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #17 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #18 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #19 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #20 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #21 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #22 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #23 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #24 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #25 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #26 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #27 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #28 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #29 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #30 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #31 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #32 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #33 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #34 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4584)\nI/flutter (18130): #35 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #36 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #37 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #38 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #39 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #40 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #41 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #42 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1668)\nI/flutter (18130): #43 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3644)\nI/flutter (18130): #44 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1666)\nI/flutter (18130): #45 ListIterable.forEach (dart:_internal/iterable.dart:39)\nI/flutter (18130): #46 _InactiveElements._unmountAll (package:flutter/src/widgets/framework.dart:1679)\nI/flutter (18130): #47 BuildOwner.finalizeTree.<anonymous closure> (package:flutter/src/widgets/framework.dart:2296)\nI/flutter (18130): #48 BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2128)\nI/flutter (18130): #49 BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:2295)\nI/flutter (18130): #50 BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:623)\nI/flutter (18130): #51 BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208)\nI/flutter (18130): #52 BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990)\nI/flutter (18130): #53 BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930)\nI/flutter (18130): #54 BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842)\nI/flutter (18130): #55 _invoke (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:120)\nI/flutter (18130): #56 _drawFrame (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:109)\nI/flutter (18130): \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nApplication finished.\nRun Code Online (Sandbox Code Playgroud)\n
我找到了一个临时的解决方法。经过进一步检查,我的dispose方法是调用mixindispose的方法ChangeNotifier而不是State<T>类的方法。
我可以通过ChangeNotifier从我的类中删除 mixin 来解决这个问题。如果有人知道如何在不消除ChangeNotifier混合的情况下解决这个问题,我相信这将是一个更好的解决方案。
| 归档时间: |
|
| 查看次数: |
6760 次 |
| 最近记录: |