加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

颤动:使用navigator.dart时失败断言

发布时间:2020-12-14 14:48:30 所属栏目:百科 来源:网络整理
导读:我是Flutter的新手并且玩弄它.所以,请耐心等待我. 单击PopupMenuButton的特定菜单项时会抛出以下异常,但始终只是第二次: ‘package:flutter/src/widgets/navigator.dart’: Failed assertion: line 1846 pos 12: ‘!_debugLocked’: is not true. 这里设置
我是Flutter的新手并且玩弄它.所以,请耐心等待我.

单击PopupMenuButton的特定菜单项时会抛出以下异常,但始终只是第二次:

‘package:flutter/src/widgets/navigator.dart’: Failed assertion: line
1846 pos 12: ‘!_debugLocked’: is not true.

这里设置:

为了指定菜单项,已经定义了以下类:

class PopupMenuChoice {
  const PopupMenuChoice({this.title,this.pageRoute});

  final String title;
  final MaterialPageRoute pageRoute;
}

在AppBar的actions属性中定义PopupMenuButton:

new PopupMenuButton<PopupMenuChoice>(
    itemBuilder: (BuildContext context) {
      return _popupMenus.map((PopupMenuChoice choice) {
        return new PopupMenuItem<PopupMenuChoice>(
          value: choice,child: new Text(choice.title),);
      }).toList();
    },onSelected: _popupMenuSelected,),

相应的小部件在下面的类中定义(AppBar在此类的“return new Scaffold”中创建):

class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final _saved = new Set<WordPair>();
  final _popupMenus = <PopupMenuChoice>[];

  ...
}

正如您所看到的,有用于保存WordPair对象的私有变量,还有用于菜单选项的私有变量.

_popupMenus列表在“构建覆盖”中设置:

@override
Widget build(BuildContext context) {
    // Setup page routes
    if (_popupMenus.where((p) => p.title == 'Saved Suggestions').length == 0) {
      final _pageRouteSavedSuggestions = new MaterialPageRoute(
        builder: (context) {
          final tiles = _saved.map(
            (pair) {
              return new ListTile(
                title: new Text(
                  pair.asPascalCase,style: _biggerFont,);
            },);
          final divided = ListTile
              .divideTiles(
                context: context,tiles: tiles,)
              .toList();

          return new Scaffold(
            appBar: new AppBar(
              title: new Text('Saved Suggestions'),body: new ListView(children: divided),);
        },);
      _popupMenus.add(new PopupMenuChoice(
          title: 'Saved Suggestions',pageRoute: _pageRouteSavedSuggestions));
    }

    if (_popupMenus.where((p) => p.title == 'TEST Page').length == 0) {
      final _pageRouteTest = new MaterialPageRoute(
        builder: (context) {
          return new Scaffold(
            appBar: new AppBar(
              title: new Text('TEST Page'),body: new Text('Some content...'),);
      _popupMenus.add(
          new PopupMenuChoice(title: 'TEST Page',pageRoute: _pageRouteTest));
    }
    ...

在PopupMenuChoice定义的MaterialPageRoute中,私有变量可能是访问权限(例如_saved).

这里是onSelected的PopupMenuButton的相应事件处理程序:

void _popupMenuSelected(PopupMenuChoice choice) {
  Navigator.of(context).push(choice.pageRoute);
}

任何人都可以解释为什么抛出这个异常?它怎么能被阻止?

谢谢,
罗杰

在特定菜单项上单击第二次时,调试控制台中的其他信息:

E/flutter (17133): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)]
Unhandled exception: E/flutter (17133):
‘package:flutter/src/widgets/routes.dart’: Failed assertion: line 177
pos 12: ‘!_transitionCompleter.isCompleted’: Cannot install a
MaterialPageRoute after disposing it. E/flutter (17133): #0
_AssertionError._doThrowNew (dart:core/runtime/liberrors_patch.dart:37:39) E/flutter (17133): #1
_AssertionError._throwNew (dart:core/runtime/liberrors_patch.dart:33:5) E/flutter (17133): #2
TransitionRoute.install (package:flutter/src/widgets/routes.dart)
E/flutter (17133): #3 ModalRoute.install
(package:flutter/src/widgets/routes.dart:740:11) E/flutter (17133): #4
NavigatorState.push
(package:flutter/src/widgets/navigator.dart:1444:11) E/flutter
(17133): #5 RandomWordsState.build._popupMenuSelected
(file:///D:/Flutter%20Projects/startup_namer/lib/main.dart:166:29)
E/flutter (17133): #6
_PopupMenuButtonState.showButtonMenu. (package:flutter/src/material/popup_menu.dart) E/flutter (17133): #7
_RootZone.runUnary (dart:async/zone.dart:1381:54) E/flutter (17133): #8 _FutureListener.handleValue (dart:async/future_impl.dart:129:18) E/flutter (17133): #9
Future._propagateToListeners.handleValueCallback
(dart:async/future_impl.dart:633:45) E/flutter (17133): #10
Future._propagateToListeners (dart:async/future_impl.dart:662:32)
E/flutter (17133): #11 Future._completeWithValue
(dart:async/future_impl.dart:477:5) E/flutter (17133): #12
Future._asyncComplete.
(dart:async/future_impl.dart:507:7) E/flutter (17133): #13
_microtaskLoop (dart:async/schedule_microtask.dart:41:21) E/flutter (17133): #14 _startMicrotaskLoop
(dart:async/schedule_microtask.dart:50:5)

解决方法

你有没有尝试过:

void _popupMenuSelected(PopupMenuChoice choice) {
  Navigator.push(context,choice.pageRoute);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读