Looking up a deactivated widget's ancestor is unsafe

前端 未结 5 2051
鱼传尺愫
鱼传尺愫 2020-12-29 03:46

I am new in Flutter and I am trying receive data with a Dialog. When a click in textField the error of image2 appear...

相关标签:
5条回答
  • 2020-12-29 03:53

    Try this:

        Future<AlertDialog> myDialog(BuildContext context) {
        return showDialog<AlertDialog>(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              content: Container(
                margin: EdgeInsets.all(8.0),
                child: Form(
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      TextFormField(
                        decoration: InputDecoration(
                            labelText: "Insira o número de telefone",
                            border: OutlineInputBorder(
                                borderRadius:
                                    BorderRadius.all(Radius.circular(2.0)))),
                      ),
                    ],
                  ),
                ),
              ),
              actions: <Widget>[
                FlatButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Text("Cancelar")),
                FlatButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Text("Aceitar"))
              ],
            );
          },
        );
      }
    
    0 讨论(0)
  • 2020-12-29 03:54

    I got the same error when attempting to open a dialog and I found a solution here: github flutter issues. Specifically, I followed the poster's recommendation, which was to create a GlobalKey and associate it with the Scaffold widget, and use the context from that key when creating the dialog. In my case, I have a globally accessible object which holds the GlobalKey:

    MyGlobals myGlobals = MyGlobals();
    class MyGlobals {
      GlobalKey _scaffoldKey;
      MyGlobals() {
        _scaffoldKey = GlobalKey();
      }
      GlobalKey get scaffoldKey => _scaffoldKey;
    }
    

    In the Scaffold widget constructor call:

    Scaffold(
      appBar: ...,
      body: ...,
      drawer: ...,
      key: myGlobals.scaffoldKey,
    )
    

    And in the showDialog call:

    showDialog<String>(
      barrierDismissible: ...,
      builder: ...,
      context: myGlobals.scaffoldKey.currentContext,
    );
    
    0 讨论(0)
  • 2020-12-29 04:01

    Try This

    Give different context name for dialog

     showDialog(context: context,builder: (dialogContex){
                  return Dialog(
                    child: Container(
                      margin: EdgeInsets.all(8.0),
                      child: Form(
                        child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: <Widget>[
                            TextFormField(
                              decoration: InputDecoration(
                                  labelText: "Insira o número de telefone",
                                  border: OutlineInputBorder(
                                      borderRadius: BorderRadius.all(Radius.circular(2.0)))),
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.end,
                              children: <Widget>[
                                FlatButton(
                                    onPressed: () {
                                      Navigator.of(dialogContex).pop();
                                    },
                                    child: Text("Cancelar")),
                                FlatButton(
                                    onPressed: () {
                                      Navigator.of(context).pop();
                                    },
                                    child: Text("Aceitar"))
                              ],
                            )
                          ],
                        ),
                      ),
                    ),
                  );
                });
    
    0 讨论(0)
  • 2020-12-29 04:07

    You’re trying to access a context that isn’t probably available. That happens because you’ve assigned your Dialog to a var and afterwards use a different context (the one from your dialog builder).

    Either create your dialog directly after your return in the builder or make it a method instead that returns a Dialog and pass it a BuildContext parameter.

    Widget myDialog(BuildContext context) => Dialog(/*your dialog here*/);
    

    This is also a more convenient Flutter practice. You should use methods that return widgets instead of assigning it to variables.

    0 讨论(0)
  • 2020-12-29 04:20

    Declare a global variable

        final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
    

    then register the key on your widget build's scaffold eg

        @override
        Widget build(BuildContext context) {
         return Scaffold(
           key: _scaffoldKey,
           ...
    

    then on the dialog

    show(BuildContext context){
    
    var dialog = Dialog(
      child: Container(
        margin: EdgeInsets.all(8.0),
        child: Form(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(
                    labelText: "Insira o número de telefone",
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(2.0)))),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  FlatButton(
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      child: Text("Cancelar")),
                  FlatButton(
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      child: Text("Aceitar"))
                ],
              )
            ],
          ),
        ),
      ),
    );
    

    Pass that scaffold context to the showDialog method

    showDialog(context: _scaffoldKey.currentContext ,builder: (context){
      return dialog;
     });
    }
    
    0 讨论(0)
提交回复
热议问题