颤振错误:'上下文!= null':不正确

Posted

技术标签:

【中文标题】颤振错误:\'上下文!= null\':不正确【英文标题】:Flutter Error: 'context != null': is not true颤振错误:'上下文!= null':不正确 【发布时间】: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() 的文档: 【参考方案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"),));

 

【讨论】:

非常感谢。第二个选项对我有用。再次感谢 断言失败::'context != null':不正确。出现此错误。【参考方案2】:

用 Builder 包裹 Scaffold 的主体

Scaffold(
 body:Builder(builder:(BuildContext context)
   return ModalProgressHUD(...);
  ),
)

在您的 _trySubmit 函数中传递上下文

           RoundedButton(
                  title: 'Register',
                  colour: Colors.blueAccent,
                  onPressed: ()
                    _trySubmit(context);
                  ,
                ),

你的 trySubmit 应该是这样的

void _trySubmit(scaffContext) async 

然后将此 scaffContext 传递给 Scaffold.of(scaffContext)。用 scaffContext 替换 ctx。

【讨论】:

现在我收到这个错误:-- E/flutter (14138): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:调用了 Scaffold.of()具有不包含脚手架的上下文。 E/flutter (14138):从传递给 Scaffold.of() 的上下文开始,找不到 Scaffold 祖先。这通常发生在提供的上下文来自与其构建函数实际创建正在寻找的 Scaffold 小部件相同的 StatefulWidget 时。 用 Builder 包裹脚手架的主体,并从 builder 传递上下文以尝试提交 再次出现同样的错误。使用不包含 Scaffold 的上下文调用 Scaffold.of()。 您是否从构建器传递上下文? 是的,无论如何,谢谢以上答案通过创建全局密钥对我有用。

以上是关于颤振错误:'上下文!= null':不正确的主要内容,如果未能解决你的问题,请参考以下文章

颤振-'initialValue == null ||控制器 == null': 不正确。表单小部件中的错误

颤振错误:此小部件已卸载,因此状态不再具有上下文(应视为已失效)

关闭导航器时出现颤振错误

错误:颤动中未定义的名称“上下文”

颤振显示上下文操作快捷方式不起作用

颤振未定义的名称“上下文”。尝试将名称更正为已定义的名称,或定义名称