#flutter #flutter-layout
#сбой #флаттер-макет
Вопрос:
При использовании SnackBar в моем приложении flutter я получил контекстную ошибку. итак, я использовал buildcontext ctx для этого, и теперь я получаю эту ошибку. Есть какие-нибудь советы, как это исправить?
Это ошибка, которую я получаю:-
E / flutter (30109): [ОШИБКА: flutter/lib/ui/ui_dart_state.cc(157)] Необработанное исключение: ‘package: flutter/src/material/scaffold.dart’: Ошибочное утверждение: строка 1452 поз. 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 (пакет: flutter/src/material/scaffold.dart: 1452:12) E / flutter (30109): #3 _RegistrationScreenState._trySubmit (пакет: flash_chat/screens/registration_screen.dart:44:18) E / flutter (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,
),
],
),
),
),
),
);
}
}
Комментарии:
1. Ваш ctx равен нулю, нигде не задавался. Почему бы вам просто не использовать context? вы использовали в FocusScope.of(context).unfocus(); код
2. я использовал context, затем я получил эту ошибку:- E / flutter (13028): не удалось найти предка Scaffold, начиная с контекста, который был передан в Scaffold.of(). Обычно это происходит, когда предоставленный контекст взят из того же StatefulWidget, что и тот, функция сборки которого фактически создает искомый виджет Scaffold. E / flutter (13028): Есть несколько способов избежать этой проблемы. Проще всего использовать конструктор для получения контекста, который находится «под» каркасом. Пример этого, пожалуйста, смотрите в документации для Scaffold.of():
Ответ №1:
First option : Wrap your body with Builder widget like :
=> Builder : (builder : (context) => yourBody(),),
Second option : Create a global key for reaching your context state such as
=> GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
and Scaffold(key : _scaffoldKey) then use it whereever you want like
=> _scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("Scaffold key"),));
Комментарии:
1. большое спасибо. второй вариант сработал для меня. еще раз спасибо
2. Неудачное утверждение: : ‘context != null’: неверно. возникает эта ошибка.
Ответ №2:
Оберните тело каркаса с помощью Builder
Scaffold(
body:Builder(builder:(BuildContext context){
return ModalProgressHUD(...);
}),
)
Передайте контекст в вашей функции _trySubmit
RoundedButton(
title: 'Register',
colour: Colors.blueAccent,
onPressed: (){
_trySubmit(context);
},
),
Ваша попытка отправки должна выглядеть следующим образом
void _trySubmit(scaffContext) async {
Затем передайте этот scaffContext в Scaffold.of(scaffContext). Замените ctx на scaffContext.
Комментарии:
1. Теперь я получаю эту ошибку:— E / flutter (14138): [ОШИБКА: flutter/lib/ ui /ui_dart_state.cc(157)] Необработанное исключение: Scaffold.of() вызывается с контекстом, который не содержит Scaffold. E / flutter (14138): не удалось найти предка Scaffold, начиная с контекста, который был передан в Scaffold.of(). Обычно это происходит, когда предоставленный контекст взят из того же StatefulWidget, что и тот, функция сборки которого фактически создает искомый виджет Scaffold.
2. Оберните тело вашего каркаса с помощью Builder и передайте контекст из builder, чтобы попробовать отправить
3. снова та же ошибка. Scaffold.of() вызывается с контекстом, который не содержит каркаса.
4. Вы передаете контекст из конструктора?
5. да, это так, в любом случае, спасибо, приведенный выше ответ сработал для меня, создав глобальный ключ.