Ошибка Flutter: ‘context != null’: неверно

#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. да, это так, в любом случае, спасибо, приведенный выше ответ сработал для меня, создав глобальный ключ.