Flutter ScreenState Dispose 方法异常

Jae*_*ang 5 dart flutter

当我尝试在颤动中从一个屏幕导航到另一个屏幕时,我收到一个异常,指出我要更改的 ScreenState 不会调用super.dispose()dispose方法。然而,重写的dispose方法显然调用了super.dispose().

\n\n

附件是相关的类和日志。任何帮助将不胜感激。

\n\n

班级:

\n\n
import '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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

日志:

\n\n
I/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.\n
Run Code Online (Sandbox Code Playgroud)\n

Jae*_*ang 8

我找到了一个临时的解决方法。经过进一步检查,我的dispose方法是调用mixindispose的方法ChangeNotifier而不是State<T>类的方法。

我可以通过ChangeNotifier从我的类中删除 mixin 来解决这个问题。如果有人知道如何在不消除ChangeNotifier混合的情况下解决这个问题,我相信这将是一个更好的解决方案。