首页 > 解决方案 > 不能在导航器中使用脚手架全局键的上下文

问题描述

我创建了一个简单的应用程序,它通过 firebase 进行身份验证。在登录屏幕中,如果username并且password正确,它将显示主屏幕。我Navigator.of(context)用来导航到主页。在这里,context我使用了Scaffold'skey context。在登录页面中,我创建了两个按钮。一个用于登录,另一个用于导航到RegisterPage。对于两者,我都使用Scaffold'skey contextinNavigator进行导航。但是从登录页面导航到注册页面工作正常,但从登录页面导航主页工作。它说Scaffold 键上下文为 null。如果我更改 Navigator.of(_scaffoldKeylogin.currentContext)Navigator.of(context)导航器中的登录按钮,它将正常工作。为什么它不起作用Scaffold key

_scaffoldKeylogin是我的脚手架钥匙

[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null. E/flutter ( 6114): Receiver: null E/flutter ( 6114): Tried calling: findAncestorStateOfType<NavigatorState>() E/flutter ( 6114): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) E/flutter ( 6114): #1 Navigator.of (package:flutter/src/widgets/navigator.dart:2727:40) E/flutter ( 6114): #2 _LoginState.build.<anonymous closure> (package:e_wallet/Interfaces/login.dart:135:51)

代码

import 'package:e_wallet/Interfaces/home.dart';
import 'package:e_wallet/Interfaces/register.dart';
import 'package:e_wallet/Services/services.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

import 'loading.dart';

class Login extends StatefulWidget {
  final Function toggleView;
  Login({this.toggleView});

  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
 final FirebaseAuth _auth = FirebaseAuth.instance;

  final _loginformkey = GlobalKey<FormState>();
 final GlobalKey<ScaffoldState> _scaffoldKeylogin = GlobalKey<ScaffoldState>();
  final _emailcontroller = TextEditingController();
  final _passwordcontroller = TextEditingController();

  bool _obscuretext = true;
  bool _loading=false;
  String _email;
  String _password;
  String _error = "";

  void _togglePass() {
    setState(() {
      _obscuretext = !_obscuretext;
    });
  }

  @override
  Widget build(BuildContext context) {

    return _loading?Loading():Scaffold(
      key: _scaffoldKeylogin,
      body: Center(
        child: SingleChildScrollView(
          child: Container(
            margin: EdgeInsets.all(10),
            padding: EdgeInsets.all(10.0),
            child: Form(
              key: _loginformkey,
              child: Column(
                children: [
                  Text(
                    "Login",
                    style: TextStyle(fontSize: 20),
                  ),
                  TextFormField(
                    controller: _emailcontroller,
                    validator: (value) {
                      if (value.isEmpty) {
                        return "Email cannot be empty";
                      } else {
                        return null;
                      }
                    },
                    onSaved: (value) => _email = value,
                    decoration: InputDecoration(
                        labelText: "Email",
                        suffixIcon: Icon(Icons.email_outlined)),
                  ),
                  TextFormField(
                    controller: _passwordcontroller,
                    validator: (value) {
                      if (value.isEmpty) {
                        return "Password cannot be empty";
                      } else {
                        return null;
                      }
                    },
                    onSaved: (value) => _password = value,
                    obscureText: _obscuretext,
                    decoration: InputDecoration(
                      labelText: "Password",
                      suffixIcon: IconButton(
                        icon: _obscuretext
                            ? Icon(Icons.visibility_off)
                            : Icon(Icons.visibility),
                        onPressed: _togglePass,
                        color: Colors.black54,
                      ),
                    ),
                  ),
                  Container(
                    padding: EdgeInsets.symmetric(horizontal: 40),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Text(
                              _error,
                              style: TextStyle(fontSize: 20, color: Colors.red),
                            ),
                          ],
                        ),
                        Row(
                          children: [
                            Expanded(
                              child: TextButton(
                                  onPressed: () {
                                    _loginformkey.currentState.save();
                                    if (_loginformkey.currentState
                                        .validate()) {}
                                  },
                                  child: Text("Forgot Password")),
                            ),
                            Expanded(
                              child: TextButton(
                                  onPressed: () async {
                                    _loginformkey.currentState.save();
                                    if (_loginformkey.currentState.validate()) {
                                      print("logging in");
                                      try {
                                        setState(() {
                                          _loading=true;
                                        });
                                        print("login auth: : ${_auth}");
                                        UserCredential result = await _auth
                                            .signInWithEmailAndPassword(
                                                email: _email,
                                                password: _password);
                                        print(
                                            "loged in sucessfully, user : ${result.user.uid}");

                                        Navigator.of(_scaffoldKeylogin.currentContext).pushReplacement(MaterialPageRoute(builder: (context)=>Home()));

                                      } on FirebaseAuthException catch (e) {
                                        if (e.code == 'user-not-found') {
                                          print("user-not-found");
                                          setState(() {
                                            _error = 'user not found';
                                            _loading=false;
                                          });
                                        } else if (e.code == 'wrong-password') {
                                          print("wrong-password");
                                          setState(() {
                                            _error = 'wrong password';
                                            _loading=false;
                                          });
                                        }else if(e.code == 'network-request-failed'){
                                          print("error no internet");
                                          print("${e.code}");
                                          setState(() {
                                            _error = 'error: no internet';
                                            _loading=false;
                                          });
                                        }
                                      }
                                    }
                                  },
                                  child: Text("LogIn")),
                            ),
                          ],
                        ),
                        Row(
                          children: [
                            Text("Haven't created an account yet?"),
                            Expanded(
                              child: TextButton(
                                  onPressed: () {
                                   // widget.toggleView();
                                    //Navigator.of(context).pushNamed(AppRoutes.);
                                   Navigator.of(_scaffoldKeylogin.currentContext).pushReplacement(MaterialPageRoute(builder: (context)=>Register()));
                                  },
                                  child: Text("Register")),
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

标签: firebaseflutternavigatorscaffold

解决方案


推荐阅读