a2x*_*a2x 54 dialog dart flutter flutter-widget
我是 Flutter 的新手,我正在尝试使用 Dialog 接收数据。当单击 textField 时,会出现 image2 的错误...

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"))
],
)
],
),
),
),
);
showDialog(context: context,builder: (context){
return dialog;
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
I/flutter (31032): Looking up a deactivated widget's ancestor is unsafe.
I/flutter (31032): At this point the state of the widget's element tree is no longer stable. To safely refer to a
I/flutter (31032): widget's ancestor in its dispose() method, save a reference to the ancestor by calling
I/flutter (31032): inheritFromWidgetOfExactType() in the widget's didChangeDependencies() method.
I/flutter (31032):
Run Code Online (Sandbox Code Playgroud)
小智 47
声明一个全局变量
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
Run Code Online (Sandbox Code Playgroud)
然后在您的小部件构建的脚手架上注册密钥,例如
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
...
Run Code Online (Sandbox Code Playgroud)
然后在对话框上
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"))
],
)
],
),
),
),
);
Run Code Online (Sandbox Code Playgroud)
将该脚手架上下文传递给 showDialog 方法
showDialog(context: _scaffoldKey.currentContext ,builder: (context){
return dialog;
});
}
Run Code Online (Sandbox Code Playgroud)
Sav*_*vad 35
尝试这个
为对话框提供不同的上下文名称
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"))
],
)
],
),
),
),
);
});
Run Code Online (Sandbox Code Playgroud)
And*_*ing 23
我在尝试打开对话框时遇到了同样的错误,我在这里找到了解决方案:github flutter issues。具体来说,我遵循了海报的建议,即创建一个GlobalKey并将其与Scaffold小部件关联,并在创建对话框时使用该键的上下文。就我而言,我有一个全局可访问的对象,其中包含GlobalKey:
MyGlobals myGlobals = MyGlobals();
class MyGlobals {
GlobalKey _scaffoldKey;
MyGlobals() {
_scaffoldKey = GlobalKey();
}
GlobalKey get scaffoldKey => _scaffoldKey;
}
Run Code Online (Sandbox Code Playgroud)
在Scaffold小部件构造函数调用中:
Scaffold(
appBar: ...,
body: ...,
drawer: ...,
key: myGlobals.scaffoldKey,
)
Run Code Online (Sandbox Code Playgroud)
在showDialog通话中:
showDialog<String>(
barrierDismissible: ...,
builder: ...,
context: myGlobals.scaffoldKey.currentContext,
);
Run Code Online (Sandbox Code Playgroud)
Mig*_*ivo 13
您正在尝试访问可能不可用的上下文。发生这种情况是因为您已将您分配Dialog给 avar并随后使用不同的上下文(来自对话框构建器的上下文)。
要么直接在return构建器中创建对话框,要么使其成为返回 aDialog并向其传递 BuildContext参数的方法。
Widget myDialog(BuildContext context) => Dialog(/*your dialog here*/);
Run Code Online (Sandbox Code Playgroud)
这也是一种比较方便的 Flutter 实践。您应该使用返回小部件的方法,而不是将其分配给变量。
小智 7
用这个:
Navigator.of(context,rootNavigator: true).pop();
Run Code Online (Sandbox Code Playgroud)
代替
Navigator.of(context).pop();
Run Code Online (Sandbox Code Playgroud)
当您从上下文中弹出并尝试在弹出的上下文中打开新内容时,可能会发生这种情况。
()async{
Navigator.of(context).pop();
_alertPopUp(); // shows a dialog
// might do some work after
}
Run Code Online (Sandbox Code Playgroud)
如果在当前上下文上创建警报对话框,则会抛出错误,因为上下文不再存在
| 归档时间: |
|
| 查看次数: |
84701 次 |
| 最近记录: |