【发布时间】:2020-12-09 13:51:35
【问题描述】:
在我的 Flutter 应用程序中使用 SnackBar 时,我遇到了上下文错误。所以我为此使用了 buildcontext ctx,现在我收到了这个错误。任何提示如何解决这个问题?
这是我得到的错误:-
E/flutter (30109): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:'package:flutter/src/material/scaffold.dart':断言失败:第 1452 行 pos 12 : 'context != null': 不正确。
E/flutter (30109): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39) E/flutter (30109): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5) E/flutter (30109): #2 Scaffold.of (package:flutter/src/material/scaffold.dart:1452:12) E/flutter (30109): #3 _RegistrationScreenState._trySubmit (package:flash_chat/screens/registration_screen.dart:44:18) E/颤振(30109):
- 这是 .dart 文件。
class RegistrationScreen extends StatefulWidget {
static const String id = 'registration_screen';
@override
_RegistrationScreenState createState() => _RegistrationScreenState();
}
class _RegistrationScreenState extends State<RegistrationScreen> {
final _auth = FirebaseAuth.instance;
bool showSpinner = false;
String email;
String password;
String username;
BuildContext ctx;
final _formKey = GlobalKey<FormState>();
void _trySubmit() async {
final isValid = _formKey.currentState.validate();
FocusScope.of(context).unfocus();
if (isValid) {
_formKey.currentState.save();
try {
final newUser = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
if (newUser != null) {
Navigator.pushNamed(context, ChatScreen.id);
}
} on PlatformException catch (e) {
var message = 'An error occurred, Please check your credentials!';
if (e.message != null) {
message = e.message;
}
Scaffold.of(ctx).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: Theme.of(ctx).errorColor,
),
);
} catch (e) {
print(e);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: ModalProgressHUD(
inAsyncCall: showSpinner,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 24.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Flexible(
child: Hero(
tag: 'logo',
child: Container(
height: 200.0,
child: Image.asset('images/logo.png'),
),
),
),
SizedBox(
height: 48.0,
),
TextFormField(
validator: (value) {
if (value.isEmpty || !value.contains('@')) {
return 'Please enter a valid Email address.';
}
return null;
},
keyboardType: TextInputType.emailAddress,
textAlign: TextAlign.center,
onSaved: (value) {
email = value;
},
decoration:
kTextFieldDecoration.copyWith(hintText: 'Email Address'),
),
SizedBox(
height: 8.0,
),
TextFormField(
validator: (value) {
if (value.isEmpty || value.length < 4) {
return 'Please enter at least 4 characters.';
}
return null;
},
textAlign: TextAlign.center,
onSaved: (value) {
username = value;
},
decoration:
kTextFieldDecoration.copyWith(hintText: 'Username'),
),
SizedBox(
height: 8.0,
),
TextFormField(
validator: (value) {
if (value.isEmpty || value.length < 7) {
return 'Password must be at east 7 characters long.';
}
return null;
},
obscureText: true,
textAlign: TextAlign.center,
onSaved: (value) {
password = value;
},
decoration:
kTextFieldDecoration.copyWith(hintText: 'Password'),
),
SizedBox(
height: 24.0,
),
RoundedButton(
title: 'Register',
colour: Colors.blueAccent,
onPressed: _trySubmit,
),
],
),
),
),
),
);
}
}
【问题讨论】:
-
您的 ctx 为空,未在任何地方设置。你为什么不只使用上下文?您在 FocusScope.of(context).unfocus() 上使用过;代码
-
我使用了上下文,然后我得到了这个错误:- E/flutter (13028): 从传递给 Scaffold.of() 的上下文开始,找不到 Scaffold 祖先。这通常发生在提供的上下文来自与其构建函数实际创建正在寻找的 Scaffold 小部件相同的 StatefulWidget 时。 E/flutter (13028):有几种方法可以避免这个问题。最简单的方法是使用 Builder 来获取位于 Scaffold 下的上下文。有关这方面的示例,请参阅 Scaffold.of() 的文档: