我正在尝试在验证表单中的文本字段后显示不可忽略的对话框,但它会继续打印:
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);
}
答案 0 :(得分:7)
我几天前就遇到了这个问题。
经过大量异常捕获和打印后,我通过将body
的所有Scaffold
属性包装在Builder
窗口小部件中并使用Builder
解决了类似的问题作为用于Navigator操作的上下文的上下文。
有关此内容的更多信息,请参阅BuildContext
文档页面:
https://docs.flutter.io/flutter/widgets/BuildContext-class.html
遵循类似的模式帮助我解决了我的问题。
修改:这是一个代码示例,我的build
方法返回包含实际wiget构建的Builder
。
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)
),
);
}
);
}
答案 1 :(得分:5)
问题可能是由于库中的MateriaApp上下文引起的。 在MaterialApp中将新的Widget创建为首页可以解决此问题
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()),
);
},
),
);
}
}
答案 2 :(得分:2)
我遇到同样的问题我从MaterialApp
移除了class
并将其移至runApp()
中的void main()
内。