flutter 如何修复在尝试显示对话框时“使用不包括导航器的上下文请求导航器操作”

igsr9ssn  于 2023-01-18  发布在  Flutter
关注(0)|答案(4)|浏览(126)

我试图在验证表单中的文本字段后显示一个不可关闭的对话框,但它一直在打印:

03-22 12:34:46.373 8974-9001/com.mywebsite I/flutter: ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
03-22 12:34:46.397 8974-9001/com.mywebsite I/flutter: The following assertion was thrown while handling a gesture:
03-22 12:34:46.397 8974-9001/com.mywebsite I/flutter: Navigator operation requested with a context that does not include a Navigator.
03-22 12:34:46.397 8974-9001/com.mywebsite I/flutter: The context used to push or pop routes from the Navigator must be that of a widget that is a
03-22 12:34:46.397 8974-9001/com.mywebsite I/flutter: descendant of a Navigator widget.
03-22 12:34:46.404 8974-9001/com.mywebsite I/flutter: When the exception was thrown, this was the stack:
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #0      Navigator.of.<anonymous closure> (package:flutter/src/widgets/navigator.dart:725:9)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #1      Navigator.of (package:flutter/src/widgets/navigator.dart:731:6)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #2      showDialog (package:flutter/src/material/dialog.dart:486:20)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #3      SignupBodyState._showProgressDialog (package:truck_am_easy/signup.dart:310:5)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #4      SignupBodyState._verifyInputs (package:truck_am_easy/signup.dart:332:9)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #5      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:478:14)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #6      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:530:30)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #7      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #8      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
03-22 12:34:46.419 8974-9001/com.mywebsite I/flutter: #9      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:123:7)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #10     GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #11     BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #12     BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #13     BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #14     BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #15     BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #16     _invoke1 (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:134)
03-22 12:34:46.420 8974-9001/com.mywebsite I/flutter: #17     _dispatchPointerDataPacket (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:91)
03-22 12:34:46.425 8974-9001/com.mywebsite I/flutter: Handler: onTap
03-22 12:34:46.425 8974-9001/com.mywebsite I/flutter: Recognizer:
03-22 12:34:46.425 8974-9001/com.mywebsite I/flutter:   TapGestureRecognizer#01b7d(debugOwner: GestureDetector, state: ready, won arena, finalPosition:
03-22 12:34:46.425 8974-9001/com.mywebsite I/flutter:   Offset(187.0, 542.0), sent tap down)
03-22 12:34:46.425 8974-9001/com.mywebsite I/flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

但拒绝显示对话框。
拜托,我做错什么了?

我的代码的一部分

@override
  Widget build(BuildContext context) {
    return new MediaQuery(
        data: new MediaQueryData(),
        child: new MaterialApp(
          home: _buildHomeUI(),
        ));
  }

  Widget _buildHomeUI() {
    return new Scaffold(
        key: _scaffoldKey,
        body: new SafeArea(
          top: false,
          bottom: false,
          child: new Container(
              decoration: new BoxDecoration(color: MyColors.colorPrimary),
              child: new ListView(
                children: <Widget>[
//                  I removed the text fields.
                  new Container(
                    decoration:
                        new BoxDecoration(color: MyColors.colorBackground),
                    padding: const EdgeInsets.only(
                        top: 10.0, left: 15.0, right: 15.0),
                    child: new Form(
                      key: _formKey1,
                      autovalidate: _autoValidate,
                      child: new Column(
                        children: <Widget>[
                          new Container(
                            margin: const EdgeInsets.symmetric(
                                horizontal: 50.0, vertical: 25.0),
                            padding:
                                const EdgeInsets.symmetric(horizontal: 30.0),
                            decoration: new BoxDecoration(
                                borderRadius: new BorderRadius.circular(30.0),
                                color: MyColors.colorAccent),
                            child: new Container(
                              margin:
                                  const EdgeInsets.symmetric(horizontal: 10.0),
                              padding:
                                  const EdgeInsets.symmetric(vertical: 5.0),
                              child: new FlatButton(
                                  onPressed: _verifyInputs,
                                  child: const Text(Strings.signUp),
                                  highlightColor: MyColors.colorAccentDark,
                                  textColor: Colors.white),
                            ),
                          ),

                        ],
                      ),
                    ),
                  )
                ],
              )),
        ));
  }

void _showProgressDialog() {
    showDialog(
        context: context,
        barrierDismissible: false,
        child: new Dialog(
          child: new Row(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              new CircularProgressIndicator(),
              new Text(
                "Creating your details...",
                style: const TextStyle(fontFamily: Strings.customFont),
              )
            ],
          ),
        ));
  }

  void _verifyInputs() {
    final form = _formKey1.currentState;
    if (form.validate()) {
      if (checkBoxValue) {
        form.save();
        _showProgressDialog();
        _parseResponse();
      } else {
        final snackBar = new SnackBar(
          content: new Text(
            "Please accept the terms and conditions",
            style: const TextStyle(fontFamily: Strings.customFont),
          ),
        );
        _scaffoldKey.currentState.showSnackBar(snackBar);
      }
    } else {
      _autoValidate = true;
    }
  }

  void _parseResponse() async {
    Map response = await registerUser();
    Navigator.pop(context);
    print(response);
  }
fdbelqdn

fdbelqdn1#

此问题可能是由库中的MaterialApp上下文引起的。在MaterialApp中创建新的微件作为主窗口可能会解决此问题

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        home: new HomeScreen());
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Title"),
      ),
      body: new Center(child: new Text("Click Me")),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.add),
        backgroundColor: Colors.orange,
        onPressed: () {
          print("Clicked");
          Navigator.push(
            context,
            new MaterialPageRoute(builder: (context) => new AddTaskScreen()),
          );
        },
      ),
    );
  }
}
mrfwxfqh

mrfwxfqh2#

几天前我为这个问题而苦恼。
经过大量的异常捕获和打印之后,我解决了一个类似的问题,方法是将Scaffold的所有body属性 Package 在Builder小部件中,并将Builder的上下文用作Navigator操作的上下文。
更多关于这一点的信息,以及解释,可以在BuildContext文档页面中找到:
https://docs.flutter.io/flutter/widgets/BuildContext-class.html
遵循类似的模式帮助我解决了问题。

Edit:下面是一个代码示例,我的build方法返回一个Builder,它 Package 了实际的wiget构建。

Widget build(BuildContext context) {
    // TODO: implement build
    return new Builder(
      builder: (ctx) {
        return new Scaffold(            
          key: scaffoldKey,
          appBar: new AppBar( 
            title: new Text ("${sector.name} Sector" ,
              style:  new TextStyle(
              fontFamily: "Exo",
              fontWeight: FontWeight.w900,
            )),
            actions: <Widget>[
              _menuSystemsList(ctx),
              _mainMenuActions(ctx) 
            ] ,
          ),
          body:  new Builder (
            builder: (ctx2) => _makeHexmapSector(ctx2)
          ),
        );
      }
    );
  }
06odsfpq

06odsfpq3#

我遇到了同样的问题,我所做的就是从class中删除MaterialApp,并将其移到void main()中的runApp()内。

irlmq6kh

irlmq6kh4#

我有一个类似的问题,它的例外是捕捉到的手势检测器,但它是导航器推
这是在toJson内部处理JSON数据时造成的,我输入了:

"price": this.img

代替

"price": this.price

相关问题